如何在Sublime Text中删除xml标记内的特定空格?

时间:2016-02-24 21:39:53

标签: regex boost sublimetext3

我有一个文件,其中包含一些遵循特定模式的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

感谢您的建议

1 个答案:

答案 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=)进行匹配) - 它们将被删除。