我有一个文件,其中包含一些遵循特定模式的xml标记(名称和道具是占位符)
<Name id="mod:Name"/>
<Prop1 Name id="mod:object.Prop1 Name"/>
<Prop1 Prop2 Name id="mod:object.Prop1 Prop2 Name"/>
<Prop1 Prop2 Prop3 Name id="mod:object.Prop1 Prop2 Prop3 Name"/>
我正在寻找正则表达式来删除&#34; id = ...&#34;
之前的部分空格<Name id="mod:Name"/>
<Prop1Name id="mod:object.Prop1 Name"/>
<Prop1Prop2Name id="mod:object.Prop1 Prop2 Name"/>
<Prop1Prop2Prop3Name id="mod:object.Prop1 Prop2 Prop3 Name"/>
我看到(\S+)\s(?=\S+\s+)
示例,替换只是\1
,但删除了除最后一个之外的所有空格,并且在id =
<Name id="mod:Name"/>
<Prop1Name id="mod:object.Prop1 Name"/>
<Prop1Prop2Name id="mod:object.Prop1Prop2 Name"/>
<Prop1Prop2Prop3Name id="mod:object.Prop1Prop2Prop3 Name"/>
我试过像
这样的东西^((\S+)*)\s((\S+)*)\s((\S+)*)\s((\S+)*)\s(?=id)
但这给了我灾难性的回溯
不确定它是否有帮助,但Sublime使用Boost正则表达式
关于The Stack的第一个问题,欢迎对问题进行任何改进
谢谢
这似乎有效
^(?|((\S+))\s|((\S+)\s(\S+))\s|((\S+)\s(\S+)\s(\S+)\s))(id=.*)
替换$2$3$4 $5
感谢您的建议
答案 0 :(得分:1)
在id
属性
(?:<\w+|(?!^)\G)\K\s+(\w+)(?=[^<>]*\bid=")
替换为$1
。请参阅regex demo。
正则表达式使用\G
运算符(匹配上一次成功匹配后的位置,如果受(?!^)
前瞻限制)和\K
运算符,则丢弃与模式匹配的文本到目前为止。
故障:
(?:<\w+|(?!^)\G)\K
- 匹配<
后跟1个字母数字或下划线字符或上一次成功匹配的结尾,并省略找到的文本\s+
- 匹配1+空白符号(\w+)
- 匹配并捕获第1组中的一个或多个字母数字或下划线字符(我们稍后会使用$1
反向引用来恢复结果中消耗的文本。(?=[^<>]*\bid=")
- 仅使用字母数字后跟匹配的空格,直到找到id=
作为整个单词(\b
是单词边界)但在标记内(由于[^<>]*
匹配零个或多个字符而不是<
和>
)。A faster alternative(用空字符串替换):
(?:<|(?!^)\G)\w+\K\s+(?!id=)
此正则表达式匹配<
或上次成功匹配的结尾,然后是一个或多个单词字符,然后\K
将省略匹配中的整个文本,并且只有一个或多个空格将匹配(如果由于前瞻性前瞻id=
而未跟(?!id=)
进行匹配) - 它们将被删除。