批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

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

本帖最后由 uhjjhjff11d 于 2019-11-10 12:58 编辑

用一句話讓論壇裡的某些人節省上千小時。(至少上百小時)
不要用正則和匹配解析 xml 文件,powershell 本身有 xml 相關的接口了,正則是拿來處理無格式的文件的。

- 如果是特殊的格式,標題註明你要處理的格式,這樣沒有興趣的人就不用浪費時間點進去看了
- 論壇的附加檔案功能貌似有點問題,只能把很長的測試文件貼出來,導致帖子難以閱讀
- 編輯帖子有時候會發布之後沒有更新
- 代碼沒有註釋導致新手完全放棄看代碼,只求拿來套 (這個不強求了,畢竟大家是免費分享)
- 有些代碼根本是錯的(只解決3成的問題),還會影響到其它檔案,但是標題被標記為已解決

前情提要,我是最近註冊的,之前回答過3個問題,後來覺得每次回答問題,都必須忍受時間被浪費的憤怒,所以我把回覆刪除了。(所以我並不是毫無貢獻,而且那些問題太基礎了,我答不答也沒什麼差別)

建議刪除網路一搜到處都有,5行內可以解決的問題。因為論壇看起來沒有算法來很好的排序,這樣帖子會讓有價值的內容更難被看到。a b c 三個功能都是現成的,全部合起來只需要5行。唉,懶得寫,丟到論壇浪費別人時間,反正不用錢。

以下只是舉例,我針對的是文字,不是針對個人。
如果他只要區分2個條件,這個問題就是一個 if else 3行解決。而且網路上搜索的到一堆說明。
请教如何用powershell实现bat的if...goto的效果?

smss 用戶,他的許多問題思路就是混用 dotnet batch powershell 正則,然後用來匹配 xml。明明查查文檔調調 api 就行了,他完全就是領著大家造三角形的輪子。用正則匹配來解析 xml 是邪道,獲得 xml 的屬性值這樣一個功能搞了30行代碼,這代碼價值扣除閱讀成本還有維護成本之後價值應該是負的。而且這些帖子內的代碼只要 xml 有變化有很高的機率會出錯。

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

update1
xml character data 裡面的內容依照協議是不由解析器解析的,也就是說我們可以在裡面寫其他 xml,這裡面的內容要不要混倄,就是一個還沒決定的事情。
update2

  • 修改標題:"對論壇的建議,還有關於濫用正則" -> "關於濫用正則解析 xml 文件"
  • 我已經給出簡單的範例了。取得所有節點,如果節點有 type 節點,修改,否則跳過。理論上已經解決了本來的問題了,其它都是細節,那種寫法好懂好改大家自己判斷。任何人看到我的代碼一定會覺得這麼簡單的代碼為什麼要發帖?問題就是簡單的代碼被正則搞成一團亂
  • 有人提到速度的問題。正則沒有提供型別檢查也不了解 xml 協議,xml 庫在類型出現錯誤的時候會自動拒絕操作。而且操作節點更可靠穩定,這是犧牲速度換穩定,而不是庫代碼寫的爛,或者正則多麼萬能。
  • 我是合理的指出代碼有bug,我沒說要什麼完美的代碼。我說那帖子裡面的代碼有bug,是因為那些正則本來就錯誤的操作到了表示結構的部分了。一開始走邪道,才會搞出本來不應該擔心的 bug。
  • 那些正則只是實現操作裡面的值,完全沒有實現任何操作節點的能力,到時候客戶要合情合理的功能,估計又會被說成是『需求不斷的變化』。而且這時候連基本功能都沒有,談代碼的速度都是在扯淡,電腦的運算電費比較貴,還是你的時間比較貴?
  • xml 庫只對 xml 文件負責,正則對所有可能的文本負責,以常識來判斷,提速 xml 庫更容易實現。
  • 那些正則完全沒有可靠的測試
  • 正則少了一層抽象,造成的耦合反而使得協議不靈活。底層有變動的話,只能修改所有的正則代碼(非常昂貴,而且會出錯,還必須重新測試),要不就放棄升級,底層的協議被這種代碼綁死
  • 我個人喜歡不斷的修改文章,為了避免有人覺得我逃避質疑,重述我說過的話,加上一些補充。
    錯誤的需求:原因很簡單,他的代碼沒人想看,何必混倄,而且為什麼不用現成的工具。
    錯誤的技術:交付代碼,對方看不懂,這技術失敗。交付產品出bug,這技術顯然也是失敗。
    邪道:相對正道就是邪道
    沒有生產力的代碼:用正則搞出來一直出 bug,難懂難讀,把底層邏輯和上層的操作混倄,沒有抽象導致後續架構被綁死,這些評價都是事實。
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;


三目运算符用来避节点未定义的坑
综合型编程论坛
Writing Code That Nobody Else Can Read.

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

返回列表