[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[技术讨论] 關於濫用正則解析 xml 文件

本帖最后由 uhjjhjff11d 于 2019-11-16 01:53 编辑


  • 處理 xml api 顯然比正則可靠
  • xml character data 裡面的內容依照協議是不由解析器解析的,也就是說我們可以在裡面寫其他 xml,那些代碼完全忽視了這一點
  • 對於違反 xml 協議的操作,那些代碼沒有提供任何的檢查。xml 庫會拒絕一些不當的操作,這是犧牲速度換穩定,而不是庫代碼寫的爛,或者正則多麼萬能。
  • xml 庫只對 xml 文件負責,正則對所有可能的文本負責,以常識來判斷,提速 xml 庫更容易實現。
  • 修改標題:"對論壇的建議,還有關於濫用正則" -> "關於濫用正則解析 xml 文件"
  • 我從來沒說要什麼完美的代碼,那些帖子裡面使用正則的代碼確實錯誤的操作到了表示結構的部分。那些代碼連操作結構的能力都沒有,我不認為出現 bug 的原因是因為對方需求不斷的變化。
  • 我喜歡不斷的修改文章,為了避免有人覺得我逃避質疑,重述我說過的話,加上一些補充。
    錯誤的需求:代碼沒人想看,何必混倄,而且為什麼不用現成的工具。
    錯誤的技術/沒有生產力的代碼:交付代碼,把底層邏輯和上層的操作混倄,對方看不懂,看懂了也不好改。交付產品出 bug,這樣不是用了錯誤的技術嗎?
    邪道:相對正道就是邪道


相關的帖子

求PowerShell批量计算文本指定数值后替换原值
[已解决]20元修改归类并正则匹配所有属性值
[文本处理] 怎样批量计算后替换文本内容
100元人民币 求bat或Powershell处理文本内容【已解决】
5

评分人数

顺一句,vbs的xmlDOM
  1. Set objXmlDom = CreateObject("Microsoft.XMLDOM")
复制代码
用法见:https://www.runoob.com/dom/dom-tutorial.html
实例见:http://www.bathome.net/thread-54111-1-1.html

TOP

讽刺的是在这个论坛中,伸手党很受欢迎,
管理、几个坛友带头回答,
这个论坛都快成“批处理/vbs/js/powershell无偿代写论坛“了。

TOP

几个坛内元老级人物24小时出现在伸手党问的问题下,
而却对实质改善论坛社区的帖子(比如这个http://www.bathome.net/thread-54156-1-1.html)视而不见,没有什么基本的鼓励措施(如高亮、置顶、挂在首页)、甚至加分都没有,
论坛的老人为什么越来越少,由此可见一斑。
1

评分人数

TOP

这个论坛与 dostips 风格差异比较大

问题:
BAT 是便宜速干的胶水 还是(甚至是无所不能的)瑞士军刀?
我只是再次提出这样的问题, 不予评论不同的观点, 所有看到的人都自有自己的想法

观点:
我从不认为 BAT 无所不能, 或者有人可以用机器语言写出 OS, 如果他喜欢这样做的话
我极少用 BAT 解决实在的问题, 即使真解决问题时, 也只是用了 最常用的命令最常用的功能而已

TOP

回复 3# 老刘1号

无论他们为什么样的帖子作解答, 我相信他们希望这个论坛还有生机, 谢谢他们的坚持!

TOP

作为一个编程论坛,显然坛内的学习氛围并不浓,
甚至直白的说,基本没有。
一个新人出现了问题,打开论坛一看,全是不动脑子发帖求助的帖子,
那么我想,他也不会”傻傻的“去学习相关知识,而是注册个账号直接免费发问。
有人回答,他就会继续发问,所以出现了4级士官的老伸手党。(以前还有个6级的被我怼走了)
甚至某些伸手党脑子不太灵活,以为这是理所应当的,在群里和热心群员对线。

TOP

这样,真正来论坛学习知识的会越来越少,伸手党会越来越多。
当然,这个恶性循环的一个重要环节——论坛元老们对于伸手党的”慷慨相助“依旧运行正常,这就会导致论坛的气氛越来越差。
我寻思,现在技术都这么不值钱了么?
还是说,论坛没有伸手党就开不下去?

某位坛内元老以前说过,他想营造一个互帮互助的环境,
但是这互帮互助的环境是一个不用学习,只要提出需求就有人回答的”伸手乐园“吗?
这互帮互助的环境是一个提问不用思考,”在线多对一零基础教学“的环境吗?

TOP

楼主提到的“正则滥用”我不赞同。
正则处理 xml 文档只是众多方法之一,何来“滥用一说”?
顶楼所给出的例子,其示例大部分都是“非标准”的 xml 文档,用 System.xml.XmlDocument 对象处理的话会报错;另外,smss 这个 ID 的要求基本是“非标准”修改,比如删除回车换行,删除空格等等,这个不用正则还真不好办。
关于注释的问题,我并不反对适当加注释,但注释会浪费编写者时间,有时甚至得力不讨好,我只想说:懂的人秒懂,不懂的人有注释也不懂。如果不懂调用 .net 方法,不懂 XPath 查询,有注释一样云里雾里。

TOP

本帖最后由 523066680 于 2019-11-7 20:32 编辑

坐和放宽~
我最近都是用相结合的方式

          # 金额信息合计, 此处 freight 为平台运费
          $info->{price}    = $dom->at("td.product-price")->text =~ /([\d\.]+)/ ? $1 : 0;
          $info->{freight} = $dom->at("td.shipping-price")->text =~ /([\d\.]+)/ ? $1 : 0;
          $info->{adjust}   = $dom->at("td.change-price")->text =~ /([\d\.]+)/ ? $1 : 0;
          $info->{discount} = $dom->at("td.discount-price")->text =~ /([\d\.]+)/ ? $1 : 0;
          $info->{amount} = $dom->at("td.order-price")->text =~ /([\d\.]+)/ ? $1 : 0;

          # 待定
          $info->{escrowCom} = $dom->at("td.fee")->text =~ /([\d\.]+)/ ? $1 : 0;
          $info->{unionCom} = "-";
          $info->{estimate} = $dom->at(".fund-bd td.amount")->text =~ /([\d\.]+)/ ? $1 : 0;


三目运算符用来避节点未定义的坑

TOP

LZ 既然有更好的方法, 可以在帖子里直接写份更简单的代码贴出来.
大家发现直接用内置的 xml 接口能很好地完成, 自然就都会去用了.


回复 8# 老刘1号
伸手党这个问题确实...

论坛确实太宽容了, 与之形成鲜明对比的是我混的 tg Python 群, 伸手党问题基本不受理, 搞不好还会直接被 ban ( 不过这个感觉有点走到另一个极端了... ( 嘛, 毕竟流行语言不怕没人

不过学习氛围这个事我觉得可能无解了, bat 毕竟已经没落了....
现在的回答都是清一色混编
其实也可以理解: 既然可以用其他语言轻松解决的事情, 为什么要去钻研那些奇技淫巧呢?
如果选择学习其他语言, 那为啥要在批处理论坛提问呢

而且 bat 能探索的地方基本上都被前人探索遍了
老人与新人的差距极大, 对老人来说 bat 基本上没有什么秘密了
这种情况下根本就难以产生高质量的讨论, 毕竟一般都是水平相近才能讨论地起来

唉, bat 就好像已经走到尽头了一样

TOP

本帖最后由 a20150604 于 2019-11-7 21:19 编辑

回复 10# 523066680

我自己用过的最长也较复杂的正则模式, 近几月的事, 之前从未对正则有过这样的需求, 也就从未有过多的学习:
从一段有较固定格式的文本解析出 25 个子项  (语言: javascript)
长而包含多项子匹配(甚至嵌套)的模式写得稍不好, 就极大降低运行效率, 甚至卡死. 简单测试基本无卡死就作罢了
  1. var patt_ZDJY = /任务编号[\::]?\s*(ZD20\d{14}|ZD20\d{12}|LS\d{11}|)\s*[\|]?[\s\S]*请求服务[\::]?\s*((?!车架号)\S*|(?!车架号)\S[\s\S]*\S|)\s*车架号[\::]?\s*([\da-z]{17}|\**[\da-z]{6}|)\s*\S*[\s\S]*车牌号[\::]?\s*(\S*)\s*车主姓名[\::]?\s*(\S*)\s*车主电话[\::]?\s*(1\d{10}|)\s*(?:车辆品牌)?[\::]?\s*(\S*|\S[\s\S]*\S)\s*车型[\::]?\s*((?!备注)\S*|(?!备注)\S[\s\S]*\S|)\s*(?:备注)?[\::]?\s*(\S*|\S[\s\S]*\S)\s*请求地址[\::]?\s*([^\s\,,]+(?![,,,])|[^\s\,,][\s\S]*[^\s\,,]|)[,,\s]*位于[\::]?\s*\S*\s*地址补充[\::]?\s*(\S*|\S[\s\S]*\S)\s*目的地地址[\::]?\s*(\S*|\S[\s\S]*\S)\s*目的地补充[\::]?\s*(\S*|\S[\s\S]*\S)\s*服务商名称[\::]?\s*(\S*|\S[\s\S]*\S)\s*服务车辆[\::]?\s*(\S*)\s*服务人员工号[\::]?\s*(\S*)\s*服务人员电话[\::]?\s*(1\d{10}|)\s*[\s\S]*服务人员到达事发地[\::]?\s*(\S*|\S[\s\S]*\S)\s*实拖目的地[\::]?\s*((?!(?:故障类型|指定子机构))\S*|(?!(?:故障类型|指定子机构))\S[\s\S]*\S|)\s*(?:故障类型)?[\::]?\s*(\S*|\S[\s\S]*\S)\s*(?:故障类型确认)?[\::]?\s*(\S*|\S[\s\S]*\S)\s*(?:指定子机构)?[\::]?\s*(\S*|\S[\s\S]*\S)\s*结算类型[\::]?\s*(\S*|\S[\s\S]*\S)\s*(?:服务状态)?[\::]?\s*(\S*|\S[\s\S]*\S)\s*(?:服务是否成功)?[\::]?\s*(\S*)\s*(?:服务评价)?/i;
复制代码

TOP

回复 10# 523066680


    晕,我说几个又不是全部

TOP

本帖最后由 老刘1号 于 2019-11-7 22:02 编辑

回复 11# bailong360


    其实可以大推各种强力第三方的教程,毕竟批的第三方库还是丰富且强大的,
特别如:文本处理可以用各种linux shell命令的win32版本,图像处理可以用imagemagick,媒体流处理可以用FFMPEG。
这些工具要用其它语言调用,学习成本肯定比批处理高,实现也不一定简洁。

论坛现在就是,第三方工具封装好的一大堆,没人用。
回答清一色用混编我私以为是要给伸手党一个触手可得的运行环境做出的无奈之举。

批也有一些得天独厚的优点,如文件管理,
比如深度优先遍历一个目录,来一句dir就行了,其它语言可能还要来个递归
我个人认为,批用来管理文件还是挺舒服的
1

评分人数

    • ivor: 服务器用第三方工具有风险,还是尽量用系统 ...技术 + 1

TOP

回复 12# a20150604


    这么庞大的正则……
正则这么复杂的规则,还要匹配这么长的条件,cpu处理起来困难很正常,
正则写的太长也不利于阅读,

一般正则超过15个字符的话就要考虑用条件判断、循环什么的来代替了,再长了咱也难受,cpu更受不了

TOP

返回列表