【问题标题】:Notepad++ regex to match and replace first comma between certain tagsNotepad++ 正则表达式匹配和替换某些标签之间的第一个逗号
【发布时间】:2021-07-18 13:09:05
【问题描述】:

我在 Notepad++ 中打开了类似的数据:

<title>Name 1, Address 1, NY</address>
<title>Name 2, Address 2, California</address>
<title>Name 3, Address 3, Texas</address>
<title>Name 4</title> <address>Address 4, Utah</address> <-- this line is 100% correct

...我想将第一个逗号定位在需要适当标记封闭的组上,并将其替换为:&lt;/title&gt;&lt;address&gt;

我这样做了,它针对第二组(地址),但是 replace 正则表达式我不知道用什么来保持地址数据的完整性,我尝试过这样的事情但是它会破坏整个地址:

  • 查找内容:, (.+address)
  • 替换为:&lt;/title&gt;&lt;address&gt;(.+address)

如何简单地将 first 逗号替换为新标签&lt;/title&gt;&lt;address&gt;

【问题讨论】:

  • 要在替换后保留捕获的部分,请使用对该组的反向引用,在您的情况下,它是\1(或$1)。不要在替换模式中使用正则表达式,它们是特定的模板字符串。
  • 太棒了,我做到了,而且效果很好:
    \1 谢谢!
  • 如何避免定位已经包含的标题标签?
  • 尝试&lt;title&gt;[^&lt;&gt;,\v]*\K,\h*([^&lt;&gt;\v]*&lt;/address) 并替换为&lt;/title&gt; &lt;address&gt;\1。但在这种情况下,您的要求 - 如何简单地用新标签替换第一个逗号 - 是错误的。

标签: regex notepad++


【解决方案1】:

你可以使用

<title>[^<>,\v]*\K,\h*([^<>\v]*</address>)

替换为&lt;/title&gt; &lt;address&gt;\1

the regex demo

详情

  • &lt;title&gt; - 一个字符串 &lt;title&gt;
  • [^&lt;&gt;,\v]* - 除了&lt;&gt;、逗号和任何垂直空格之外的零个或多个字符
  • \K - 匹配重置运算符,丢弃到目前为止匹配的所有文本
  • , - 逗号
  • \h* - 零个或多个水平空格
  • ([^&lt;&gt;\v]*&lt;/address&gt;) - 组 1($1\1 反向引用指的是组值):
    • [^&lt;&gt;\v]* - 除了&lt;&gt; 和任何垂直空格之外的零个或多个字符
    • &lt;/address&gt; - &lt;/address&gt; 字符串。

【讨论】:

  • 我会使用短代码查找:^.*?\K,全部替换为&lt;/title&gt; &lt;address&gt;
  • @HajiRahmatullah 您一定在考虑问题中所述的“替换第一个逗号”解决方案。当我也被此要求欺骗时,我将问题作为重复项关闭。然而,问题并没有那么简单,逗号必须在两个不匹配的标签内,&lt;title&gt;&lt;/address&gt;。尝试regex you suggest 后,这一点变得清晰:1)间距变得有点混乱,2)错误的, 在最后一行被替换,导致结果无效。
  • 是的,我看到它影响了最后一行,但最后一行是假设他表示他的输出是这样的......你看到他把单词标题拼错为tile ?在第四行
猜你喜欢
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多