【问题标题】:How do I remove specific whitespace inside xml tag in Sublime Text?如何在 Sublime Text 中删除 xml 标签内的特定空格?
【发布时间】:2016-02-24 21:39:52
【问题描述】:

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

我正在寻找正则表达式以从“id=...”之前的部分中删除空格

这应该是什么样子

<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

谢谢你的建议

【问题讨论】:

  • 你能使用像 JavaScript 这样的语言吗?你不能使用纯正则表达式 (除非在字符串上多次应用正则表达式) .. 但是如果你使用像 Javascript 这样的语言,你可以使用 .replacecallback 来做你想做的事需要。
  • 你能举个例子吗?
  • 第二个代码块是结果应该是什么样子,我将编辑和突出显示
  • 感谢@Shafizadeh 的建议,您再次发布的正则表达式是什么
  • 您可以在 SublimeText 中轻松做到这一点。不是^(?|((\S+))\s|((\S+)\s(\S+))\s|((\S+)\s(\S+)\s(\S+)\s))(id=.*)

标签: regex boost sublimetext3


【解决方案1】:

id 属性之前删除所有空格的正确正则表达式将是

(?:<\w+|(?!^)\G)\K\s+(\w+)(?=[^<>]*\bid=")

替换为$1。请参阅regex demo

正则表达式使用\G 运算符(如果限制为(?!^) 前瞻,则匹配最后一次成功匹配之后的位置)和\K 运算符,该运算符丢弃到目前为止与模式匹配的文本。

细分:

  • (?:&lt;\w+|(?!^)\G)\K - 匹配 &lt; 后跟 1+ 字母数字或下划线字符或最后一次成功匹配的结尾并省略找到的文本
  • \s+ - 匹配 1+ 个空格符号
  • (\w+) - 匹配并捕获到第 1 组中的一个或多个字母数字或下划线字符(我们稍后将使用 $1 反向引用在结果中恢复此使用的文本)
  • (?=[^&lt;&gt;]*\bid=") - 仅继续匹配空格,后跟字母数字,直到找到 id= 作为整个单词(\b 是单词边界)但在标签内(由于 [^&lt;&gt;]* 匹配除&lt;&gt; 之外的零个或多个字符。

一个faster alternative(用空字符串替换):

(?:<|(?!^)\G)\w+\K\s+(?!id=)

此正则表达式匹配&lt; 或最后一次成功匹配的结尾,然后是一个或多个单词字符,然后\K 将从匹配中省略整个文本,并且仅匹配1 个或多个空格(如果最后没有跟id=,因为负前瞻(?!id=)) - 它们将被删除。

【讨论】:

  • 优雅高效... \G 和 \K 有什么作用? @@WiktorStribiżew
  • 我已经在Breakdown 之前描述了它们。请注意,\G 匹配字符串的开头和最后一次成功匹配的结尾,这就是为什么它必须与(?!^) 一起使用。但我看到你也可以使用更快的(?:&lt;|\G)\w+\K\s+(?!id=)。我会更新的。
  • 太棒了,这是一些正则表达式...感谢您的回答和故障
  • 那么将 (?!^) 添加到 \G 是否更正确/必要?似乎没有@WiktorStribiżew 也可以工作
  • 那个是给JS的,JS正则比PCRE/Boost正则差很多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
相关资源
最近更新 更多