Board logo

标题: [技术讨论] 關於濫用正則解析 xml 文件 [打印本页]

作者: uhjjhjff11d    时间: 2019-11-7 15:18     标题: 關於濫用正則解析 xml 文件

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



相關的帖子

求PowerShell批量计算文本指定数值后替换原值
[已解决]20元修改归类并正则匹配所有属性值
[文本处理] 怎样批量计算后替换文本内容
100元人民币 求bat或Powershell处理文本内容【已解决】
作者: 老刘1号    时间: 2019-11-7 16:13

顺一句,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
作者: 老刘1号    时间: 2019-11-7 16:20

讽刺的是在这个论坛中,伸手党很受欢迎,
管理、几个坛友带头回答,
这个论坛都快成“批处理/vbs/js/powershell无偿代写论坛“了。
作者: 老刘1号    时间: 2019-11-7 16:29

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

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

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

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

回复 3# 老刘1号

无论他们为什么样的帖子作解答, 我相信他们希望这个论坛还有生机, 谢谢他们的坚持!
作者: 老刘1号    时间: 2019-11-7 16:39

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

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

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

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

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

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



三目运算符用来避节点未定义的坑
作者: bailong360    时间: 2019-11-7 20:34

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


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

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

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

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

唉, bat 就好像已经走到尽头了一样
作者: a20150604    时间: 2019-11-7 20:44

本帖最后由 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;
复制代码

作者: 老刘1号    时间: 2019-11-7 21:41

回复 10# 523066680


    晕,我说几个又不是全部
作者: 老刘1号    时间: 2019-11-7 21:58

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

回复 11# bailong360


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

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

批也有一些得天独厚的优点,如文件管理,
比如深度优先遍历一个目录,来一句dir就行了,其它语言可能还要来个递归
我个人认为,批用来管理文件还是挺舒服的
作者: 老刘1号    时间: 2019-11-7 22:18

回复 12# a20150604


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

一般正则超过15个字符的话就要考虑用条件判断、循环什么的来代替了,再长了咱也难受,cpu更受不了
作者: cfwyy77_bat    时间: 2019-11-8 08:24

路过...
楼主是台湾的朋友吗? 个人看繁体真的是不太习惯。
楼主说的建议很中肯。现在如果要解析xml 或者html,除非是文本又短又特别简单的需求,我才会用正则,其它我更愿意选择相应的解析库,各个语言应该基本都有相应的库。
关于伸手党的问题,我个人觉得就是现在大环境所致,现在的人大都比较浮躁,都比较想要快速达到目的,只注重结果,不注重过程,所有有些基础的东西,有人也不愿意去学,想直接知道结果。
话又说回来,现在论坛人气真的不高,我也相信bat一些东西用的人真的不多了。所以我感觉论坛版主对这方面也比较宽容的。
作者: xczxczxcz    时间: 2019-11-8 09:03

吃瓜群众:
老纳望着江面如织般的船只,曰:两人耳!
作者: 老刘1号    时间: 2019-11-8 09:21

回复 17# cfwyy77_bat


    其实双击右上角繁体中文就好了
作者: WHY    时间: 2019-11-8 10:20

如鲠在喉、不吐不快。
凭什么使用正则处理 xml 文档要被扣上“滥用”之罪?
“一题多解”不是经常被我们大家提倡的吗?多一种解题方法和思路有坏处吗?
是因为正则不能解决 xml 文档问题?还是正则晦涩难懂?还是正则不合自己口味?
PowerShell脚本而已,首先是能够解决具体问题,然后才考虑效率、通用性、可读性等问题。
能够解决问题的方法,你完全可以不用,甚至不相信它能用,但不要轻易说它“滥”。
作者: codegay    时间: 2019-11-8 10:46

支持樓主。
作者: WHY    时间: 2019-11-8 11:15

回复 16# uhjjhjff11d


    这个是有原因的。样本是“非标准”的,<?xml version="1.0" ?>文件头都没有,第一步 [xml](type a.xml) 就行不通。说多了都是泪。
作者: uhjjhjff11d    时间: 2019-11-8 13:37

本帖最后由 uhjjhjff11d 于 2019-11-14 17:28 编辑

回复 22# WHY
29 樓的圖片顯示他手中的文檔是 xml沒錯。至於有沒有被他的正則匹配替換操作引入錯誤的內容,我就不知道了。其它人拿了錢,給出的代碼到了好幾版之後還是有 bug,那你要我說正則很適合搞 xml,我還真不認同。
100元人民币 求bat或Powershell处理文本内容【已解决】

37樓就提到了應該直接用 api

43樓也提到了直接用 api

之前看到這些回覆就不會發帖了,因為我根本不想讀下面許多濫用正則,到處是 bug 的代碼。
作者: terse    时间: 2019-11-8 14:36

我就看看 老了 唉
作者: ivor    时间: 2019-11-8 15:52

楼主出发点是好的,只是言辞可能有些过激,也是好心劝大家写 易读、高可靠、效率高的代码,正能量的帖子必须支持。
作者: 523066680    时间: 2019-11-8 16:43

本帖最后由 523066680 于 2019-11-8 16:57 编辑

回复 25# ivor

      主要是楼主没发现,smss 是个妹子
昂,原来只是QQ头像是女人而已,当我没说  (逃
作者: Batcher    时间: 2019-11-8 19:52

希望各位有志之士可以在论坛大力推广PowerShell以及第三方命令行工具
作者: WHY    时间: 2019-11-8 19:52

回复 23# uhjjhjff11d


    hi,你说的这个帖子我全程参与过,我有发言权。
问题的关键不在于使用正则合不合适,而在于提问者对问题的描述不到位,以及提问者的需求一直在变化。
就是说,修改属性值的过滤条件连他自己事先都不清楚,发现不对就更新需求,摸石头过河,走一步看一步。
连人都无法预知的问题,提问者反而让脚本事先做预判。
我认为脚本不适合干这个,几次修改后我就放弃了。

我猜你很会写 PowerShell 脚本,贴一个完美版让大家都学习一下吧。

另外,所谓的 bug 你多站在脚本编写者的角度看看,多数楼层的答案在需求不再变化的时候已经满足了要求,这算bug吗?
作者: flashercs    时间: 2019-11-8 20:05

dom与re各有利弊:dom方便易操作,而re效率高,尤其对于大量大型xml文件,dom每次创建和释放占用很多时间,re速度快;测试过,同样文件,re约为dom时间的1/3
不过对于大型xml文件,不应使用dom,而使用xmltextreader
作者: uhjjhjff11d    时间: 2019-11-8 23:56

本帖最后由 uhjjhjff11d 于 2019-11-9 11:13 编辑

回复 28# WHY
我猜你很会写 PowerShell 脚本,贴一个完美版让大家都学习一下吧。

你猜錯了,我不是程序員,也不是編程高手。

所谓的 bug 你多站在脚本编写者的角度看看,多数楼层的答案在需求不再变化的时候已经满足了要求,这算bug吗?

代碼把不是變量的東西也替換掉了
如果變量後面有數字就失效

回复 7# WHY 写的太棒了
有个小问题可以处理下吗 就是其中有数组时共用同一个名称是要替换成同名称的 虽然也替换成同名了 单生成的XTX文本 可以被读取 但部分功能不在
说明 混编时还是有问题


其中一段代碼。
  1. @echo off
  2. PowerShell "$h=@{};$s=[regex]::Replace([IO.File]::ReadAllText('a.txt',[Text.Encoding]::Default),'(?<=\bname=\")[^^\"]+(?=\")',{param($m);$a=$m.Value;if(!$h.ContainsKey($a)){$x=[Math]::floor($global:n/26);if(!$x){$c=''}else{$c=[char](64+[int]$x)};$h[$a]=$c+[char](65+$global:n++%%26)};$h[$a]});$s=[regex]::Replace($s, '(?^<=\")[^\"@#]*[@#][^^\"]+(?=\")',{param($m);$a=$m.Value;forEach($k In $h.Keys){$a=$a.Replace('@'+$k,'@'+$h[$k]).Replace('#'+$k,'#'+$h[$k])};$a});sc b.txt -Value $s -Enc utf8"
  3. pause
复制代码
[quote]回复 7# WHY
有如下几个问题
1.名称中不要出现运算符号 如name="call_name1" 居然替换成了*或/
需要规避符号 +,-,*,/,%,**,|,||,=,==, !,not
2数组不能使用或许是上个问题导致

作者: 老刘1号    时间: 2019-11-9 16:00

回复 27# Batcher


    您可以开一个FFMPEG专区吗?
现在各种视频、直播那么火,
FFMPEG作为行内的领头开源软件/框架,
命令行版本也有许多人想学习。
作者: WHY    时间: 2019-11-9 17:50

回复 30# uhjjhjff11d


    你要是想学的话,我可以教你怎么改;
但你要抬杠的话,根本不值一驳,我已经说过了,是“多数楼层的答案”,并且你完全站在提问者的角度。

拿不出完美的、比正则更好的解决方法,又极力指责“滥用正则”、“邪道”、“错误的技术”,这是正常人干的事吗?
作者: WHY    时间: 2019-11-9 18:06

还是那句话:能够解决问题的方法,不喜欢你可以不用,甚至不相信它,但不要轻易指责它。
作者: uhjjhjff11d    时间: 2019-11-9 20:44

本帖最后由 uhjjhjff11d 于 2019-11-14 17:34 编辑

回复 33# WHY
还是那句话:能够解决问题的方法,不喜欢你可以不用,甚至不相信它,但不要轻易指责它。

回复 32# WHY
拿不出完美的、比正则更好的解决方法,又极力指责“滥用正则”、“邪道”、“错误的技术”


用庫修改所有 type 節點的範例,大家自行比對哪一個好讀好改。
  1. $xmlfile = 'C:\Users\username\Documents\sample.xml'
  2. [XML]$xmlcontent = Get-Content $xmlfile
  3. function hash($string) {
  4.     new-object System.Security.Cryptography.SHA256Managed | ForEach-Object { $_.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($string)) } | ForEach-Object { $all += $_.ToString("x2") }
  5.     "varhead" + $all
  6. }
  7. $xmlcontent.SelectNodes("//*") | ForEach-Object {
  8.     if (-not ($_.Type -eq $null)){
  9.         $_.Type = hash($_.Type)
  10.     } else {
  11.         Write-Output "pass"
  12.     }
  13. }
  14. $xmlcontent.Save(".\sample2.xml")
复制代码
xml 範例(來自網絡)
  1. <?xml version="1.0"?>
  2. <PurchaseOrder PurchaseOrderNumber="99503" OrderDate="1999-10-20">
  3.   <Address Type="Shipping">
  4.     <Name>Ellen Adams</Name>
  5.     <Street>123 Maple Street</Street>
  6.     <City>Mill Valley</City>
  7.     <State>CA</State>
  8.     <Zip>10999</Zip>
  9.     <Country>USA</Country>
  10.   </Address>
  11.   <Address Type="Billing">
  12.     <Name>Tai Yee</Name>
  13.     <Street>8 Oak Avenue</Street>
  14.     <City>Old Town</City>
  15.     <State>PA</State>
  16.     <Zip>95819</Zip>
  17.     <Country>USA</Country>
  18.   </Address>
  19.   <DeliveryNotes>Please leave packages in shed by driveway.</DeliveryNotes>
  20.   <Items>
  21.     <Item PartNumber="872-AA">
  22.       <ProductName>Lawnmower</ProductName>
  23.       <Quantity>1</Quantity>
  24.       <USPrice>148.95</USPrice>
  25.       <Comment>Confirm this is electric</Comment>
  26.     </Item>
  27.     <Item PartNumber="926-AA">
  28.       <ProductName>Baby Monitor</ProductName>
  29.       <Quantity>2</Quantity>
  30.       <USPrice>39.98</USPrice>
  31.       <ShipDate>1999-05-21</ShipDate>
  32.     </Item>
  33.   </Items>
  34. </PurchaseOrder>
复制代码


[url=http://bbs.bathome.net/redirect.php?goto=findpost&ptid=52856&pid=220490]60樓的代碼
  1. goto :ansi
  2. rem UTF-8 编码支持
  3. chcp 65001
  4. cls
  5. :ansi
  6. @echo off
  7. set /p "strFile=请拖入处理文本:"
  8. setlocal enabledelayedexpansion
  9. if not exist !strFile! (
  10. echo;"!strFile!" 文件不找不到!!
  11. exit /b
  12. )
  13. endlocal
  14. rem 定义用于命名的字符表
  15. set ASC=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  16. set n=0
  17. rem 定义可用于命名的字符表
  18. set tab="." [ + - ^"
  19. rem 例外情况定义
  20. set exception=Extra Button
  21. set z=
  22. set o=
  23. setlocal enabledelayedexpansion
  24. for /f "tokens=1* delims==" %%a in (!strFile!) do (
  25. for /f "tokens=1,2 delims= " %%K in ("1 !z!") do (
  26. endlocal
  27. set z=%%L
  28. set s1=%%a
  29. set s2=%%b
  30. setlocal enabledelayedexpansion
  31. )
  32. if defined z for %%k in (%exception%) do (
  33. if "#!s1:</%%k>=!" neq "#!s1!" (
  34. set z=!z:~1!
  35. )
  36. )
  37. for %%k in (%exception%) do (
  38. if "!s1:<%%k=!" neq "!s1!" (
  39. if "#!s2:/>=!" equ "#!s2!" (
  40. set z=!z!y
  41. ) else (
  42. set o=o
  43. )
  44. )
  45. )
  46. if "!o!!z!!s1:~-5!" equ " name" (
  47. set s3=!s2:^"= !
  48. for /f "tokens=1 delims= " %%c in ("!s3!") do (
  49. if not defined #%%~c (
  50. call :getn !n! ss
  51. set sa=%%~c
  52. rem 保留"."后面的尾巴
  53. if "!sa:.=!" neq "!sa!" set ss=!ss!.!sa:*.=!
  54. for /f "tokens=1,2,3 delims= " %%x in ("!n! !ss! !z!") do (
  55. endlocal
  56. set $%%x=%%y囧%%~c
  57. set #%%~c=%%y
  58. set /a n+=1
  59. set z=%%z
  60. setlocal enabledelayedexpansion
  61. )
  62. )
  63. )
  64. )
  65. )
  66. set/a n-=1
  67. (
  68. for /f "tokens=1,*" %%a in (!strFile!) do (
  69. endlocal
  70. set stra=%%a
  71. set str=%%b
  72. setlocal enabledelayedexpansion
  73. if defined str (
  74. set "str=!stra! !str: =!"
  75. for /l %%1 in (0,1,%n%) do (
  76. for /f "tokens=1,2 delims=囧" %%b in ("!$%%1!") do (
  77. if "!str:%%c=!" neq "!str!" (
  78. if "!str:%%c=%%c!" equ "!str!" (
  79. set str=!str:"%%c"="%%b"!
  80. set str=!str:"@%%c"="@%%b"!
  81. set str=!str:"#%%c"="#%%b"!
  82. if "!str:*%%c=!" neq "!str!" (
  83. call :parti %%c %%b
  84. )
  85. ))
  86. )
  87. )
  88. ) else (
  89. set str=%%a
  90. )
  91. echo;!str!
  92. )
  93. ) >结果.txt
  94. start 结果.txt
  95. rem 查看有多少个更改
  96. set $
  97. pause
  98. exit /b
  99. rem 计算临名字,可加上前缀,多个,A 到 ZZZZ 多个
  100. :getn
  101. (set L=%1
  102. set M=%1
  103. set %2=)
  104. :loop
  105. set /a M=L %% 26
  106. set %2=!%2!!ASC:~%M%,1!
  107. if !M! neq !L! set /a L=L/26&goto :loop
  108. goto :eof
  109. rem 非双引号位置处理 如:#xxxx+  #xxxx[  ]  #xxxx.dir  
  110. :parti
  111. for %%a in (!tab!) do (
  112. if "!str:%1%%~a=!" neq "!str!" (
  113. if "!str:%1%%~a=%1%%~a!" equ "!str!" (
  114. set str=!str:@%1%%~a=@%2%%~a!
  115. set str=!str:#%1%%~a=#%2%%~a!
  116. if "!str:*%1=!" equ "!str!" (
  117. goto :partiE
  118. )
  119. )
  120. )
  121. )
  122. :partiE
  123. goto :eof
复制代码
那個帖子最後一個版本的代碼
  1. $global:n = 0; $Hash=@{};
  2. $str = [IO.File]::ReadAllText('manifest.xml',[Text.Encoding]::Default);
  3. #修改name属性的值,如果name属性值以music_prev或music_display或music_next等开头,或者节点名为Extra,则不修改
  4. $reg1 = '(?<=<(?!Extra)[^<>]*\sname=")(?!notice)(?!music_(?:prev|display|next|play|pause|album_cover))(?!notification_(?:icon|title|content|time|info|subtext|key|list))[^"]+(?=")';
  5. #如果command与target同时出现,command="play",则修改target属性值,
  6. $reg2 = '(?<=\starget=")[^"]+(?="[^<>]*\scommand="play)|(?<=\scommand="play[^<>]*\starget=") [^"]+(?=")';
  7. $str = [regex]::Replace($str, $reg1 + '|' + $reg2, {
  8.     param($m);
  9.     $key = $m.Value;
  10.     if( !$Hash.ContainsKey($key) ){
  11.         $x = [Math]::floor( $global:n / 26 );
  12.         if($x) { $chr1 = [char]( 64 + [int]$x ) } else { $chr1 = '' }
  13.         $Hash[$key] = $chr1 + [char]( 65 + $global:n++ % 26 );
  14.     }
  15.     $Hash[$key];
  16. })
  17. $arrKey = $Hash.Keys | sort -Desc {$_.Length};
  18. #如果属性值包含@#字符,或者属性值以 .animation或.visibility 结尾,则修改
  19. $str = [regex]::Replace($str, '(?<=")([^"@#]*[@#][^"]+|[^"]+(?:\.animation|\.visibility))(?=")', {
  20.     param($m);
  21.     $s = $m.Groups[1].Value;
  22.     forEach( $key In $arrKey ) {
  23.         $s = $s.Replace( '@' + $Key, '@' + $Hash[$Key] );
  24.         $s = $s.Replace( '#' + $Key, '#' + $Hash[$Key] );
  25.         $s = $s.Replace( $Key + '.animation', $Hash[$Key] + '.animation' );
  26.         $s = $s.Replace( $Key + '.visibility', $Hash[$Key] + '.visibility' );
  27.     }
  28.     $s;
  29. })
  30. [IO.File]::WriteAllText('manifest2.xml', $str, [Text.Encoding]::UTF8);
  31. $str = [IO.File]::ReadAllText('config.xml', [Text.Encoding]::Default);
  32. $str = [regex]::Replace($str, '(?<=\sid=")[^"]+(?=")', {param($m); if($Hash[$m.Value]){$Hash[$m.Value]}else{$m.Value}});
  33. [IO.File]::WriteAllText('config2.xml', $str, [Text.Encoding]::UTF8);
  34. echo 'Done';
  35. [Console]::ReadKey()
复制代码

作者: WHY    时间: 2019-11-10 22:20

我该说你啥好?喜欢抬杠,又抬不到点上。
你把我写的脚本贴出来是几个意思?是想跟你的对比,让我难堪是不是?
既然贴出来了,你看都不看一眼就开始胡咧咧?
他定义 A~ZZZ 变量范围明明有目的,没看见脚本有两个xml文件吗?他想把第二个文件与第一个文件按照某种对应关系进行修改。
明白不?打脸不?疼不?不疼我再打打?
  1. echo 範例
复制代码
你觉得这个脚本咋样?是不是完胜正则万倍?

算啦吧,各回各家,各找各妈。你的帖子我不再回复。
作者: uhjjhjff11d    时间: 2019-11-10 23:37

本帖最后由 uhjjhjff11d 于 2019-11-14 17:33 编辑

回复 35# WHY
我该说你啥好?喜欢抬杠,又抬不到点上。
你把我写的脚本贴出来是几个意思?是想跟你的对比,让我难堪是不是?
既然贴出来了,你看都不看一眼就开始胡咧咧?
他定义 A~ZZZ 变量范围明明有目的,没看见脚本有两个xml文件吗?他想把第二个文件与第一个文件按照某种对应关系进行修改。
明白不?打脸不?疼不?不疼我再打打?
echo 範例

你觉得这个脚本咋样?是不是完胜正则万倍?

算啦吧,各回各家,各找各妈。你的帖子我不再回复。


具體回覆每一個問句

作者: 523066680    时间: 2019-11-11 09:29

1. 年轻真好。
2. 一看就是工作不饱和,来人,非洲站票。(参考:朱一旦的枯燥生活)
作者: WHY    时间: 2019-11-15 16:17

本来不打算再说啥,但刚发现,LZ你把帖子标题和内容全给改掉了,对论坛的建议也没了?

那你把我的+1分吐出来吧,我不想给你了!

有这闲工夫何不把那不靠谱的“范例”好好完善修改一下,整一个完美版的、比正则更好的让我心服口服呢?

你认为仅仅靠胡咧咧和“范例”能解决这个问题,挣得到那100块钱是吗?
作者: xczxczxcz    时间: 2019-11-15 17:34

[uri]http://bbs.bathome.net/thread-53435-1-1.html[/uri]
用正则比用xml快。修改属性值的计算表达式不会对脚本产生影响。其它情况若属性值中引号之类时正则没有xml方便。若修改具体的节点属性时xml方便。
再次酱油。
作者: uhjjhjff11d    时间: 2019-11-15 23:29

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

回复 37# WHY
我可以重述一些內容


網路上很多 PowerShell 操作 xml 的影片和文檔,更好的寫法多的是。前幾樓很明顯有其他論壇的老人常常在用 xml 了,如果對 PowerShell 操作 xml 感興趣,應該去請教那些常常處理 xml 的人
我(扣除雜湊和 if else )只是寫一行代碼示範用 api 處理節點批量改名(沒需求沒興趣沒能力沒時間去寫我不感興趣的代碼),如果那寫法會把 xml 結構搞砸的話歡迎指教。
作者: codegay    时间: 2019-11-23 23:30

xmlstarlet啊,xpath的可读性确实要好不少。
作者: czjt1234    时间: 2020-1-9 08:05

回复 3# 老刘1号

这是个对象的问题,现在都面向对象
你的对象是程序员,哪怕是业余、初级程序员

但更多的是windows高级用户
比如我提问,最怕的就是只要一个知识点就能解决的实际问题,你却给我一本教材叫我全部看完,还说我是伸手党

我觉的可以大面积推广付费解答,哪怕一个问题一元两元的红包
作者: 老刘1号    时间: 2020-1-9 21:50

回复 41# czjt1234


    面向对象还行……

支持付费解答。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2