【问题标题】:Notepad++ regular expressions: Matching multiple segments separated by tokenNotepad++ 正则表达式:匹配由标记分隔的多个段
【发布时间】:2016-12-13 05:50:08
【问题描述】:

多年来,我在 Notepad++ 和 SciTE 中使用了一个非常方便的技巧,它允许我通过标记将给定的字符串拆分。例如,给定这个输入:

first name|last name
bob|johansen
scarlet|scarnetti
nelson|huguemeyer

然后我可以执行一个正则表达式来把它变成一个 HTML 表格。搜索字符串为:

(.+)|(.+)

替换字符串是:

<tr><td>\1</td><td>\2</td></tr>

最终结果是:

<tr><td>first name</td><td>last name</td></tr>
<tr><td>bob</td><td>johansen</td></tr>
<tr><td>scarlet</td><td>scarnetti</td></tr>
<tr><td>nelson</td><td>huguemeyer</td></tr>

当我有数百行长且需要转换为 HTML 格式的电子表格时,这非常有用!

不幸的是,在最近的版本中,正则表达式引擎似乎发生了变化,以至于我上面的搜索模式不再有效。第一次出现的(.+) 匹配从行首到行尾的所有内容,忽略中间的| 字符。

我已经无助地通过各种不同的搜索模式试图找到一个能够让所有内容都达到第一个|,然后是它之后的所有内容。在较长的示例中,可能有五个或六个不同的段,由| 字符分隔。

到目前为止,我的努力都失败了。我需要做什么才能通过 Notepad++ 中的正则表达式在特定标记处拆分一行输入?

【问题讨论】:

  • 有没有用过?我认为你需要(.+)\|(.+)。如果你需要first |,你的模式根本不起作用,你需要(.*?)\|(.*)在较长的示例中,可能有五个或六个不同的句段,用 | 分隔。字符。 - 那你想要什么?
  • 我突然想到你想用&lt;/td&gt;&lt;td&gt;(不需要正则表达式)替换所有|,然后2)^正则表达式用&lt;tr&gt;&lt;td&gt;和3)$用@987654337 @。不过,这可以打包到 1 个正则表达式替换中。
  • 是的,多年来一直运行良好。但我最近升级到了新版本——从 2007 年到最近,我一直在使用 SciTE 版本,看起来最近的 Notepad++ 有很多不同之处。例如,| 在我的旧版本中 不是 正则表达式重要字符。当我习惯于单行时,它现在似乎默认在多行上运行。根据您的第二条评论,我在一个包含三个部分的示例上尝试了^([^\|]+)\|([^\|]+)\|([^\|]+)$,这就是我想要的。将其归档为答案,我会接受。
  • 你可能需要投资更专业的 IDE
  • 另外,如果您只想匹配 1 行,则需要将 \r\n 添加到否定字符类中:^([^|\r\n]+)\|([^|\r\n]+)\|([^|\r\n]+)$

标签: regex notepad++


【解决方案1】:

在当前的 NPP 版本中,| 是一个 alternation 运算符。它必须在字符类之外转义以匹配文字管道符号。

您的 ^([^\|]+)\|([^\|]+)\|([^\|]+)$ 将仅匹配 3 部分 | 分隔字符串。

我想建议一个在我的second comment 中实现逻辑的正则表达式来解决这个问题:

(^)|($)|\|

并替换为

(?{1}<tr><td>:?{2}</td></tr>:</td><td>)

搜索模式详情

  • (^) - 第 1 组:行首
  • | - 或
  • ($) - 第 2 组:行尾
  • | - 或
  • \| - 文字 |

更换详情

  • (?{1} - 如果第 1 组匹配,
    • &lt;tr&gt;&lt;td&gt; - 在行首替换(实际上是添加)&lt;tr&gt;&lt;td&gt;
  • :?{2} - 否则,如果第 2 组匹配,
    • &lt;/td&gt;&lt;/tr&gt; - 在行尾添加&lt;/td&gt;&lt;/tr&gt;
  • : - 否则,| 将替换为 &lt;/td&gt;&lt;td&gt;
  • ) - 条件替换子句结束。

看截图:

【讨论】:

  • 谢谢。将来我想我会使用不太可能成为保留字符的东西作为我的标记,比如 Þ 或类似的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
相关资源
最近更新 更多