首页 > 解决方案 > 忽略 Npp 正则表达式中的特定字符

问题描述

我正在使用正则表达式的 Notepad++ 风格。这...

Find: ([^`]{1,23} )
Replace: $0\n

...接受这个输入字符串...

现在是所有好人来帮助党的时候了。

...并产生这个输出字符串:

现在是时候了

好男人来了

党的援助。

它将字符串拆分为 24 行或更少的非反引号 (`) 字符,在空格之后拆分。仅当输入字符串的最后一个字符也是空格字符时才有效。

这个字符串...

现在是所有好人█来帮助█的时候了。

...分裂不同。

现在是时候了

█来的好人

党的援助█。

我正在寻找一种跳过 █ 个字符的方法 - 处理输入字符串,就好像 █s 不存在一样。

[注意:`(反引号)字符保留用于包含文本格式标记,以便稍后插入。█ 个字符将用于表示“这段文本稍后会插入标签”,因此它们被压缩,但还没有。我在这里使用 █(完整块)来表示 Unicode 7F(del)字符,因为 7F 无法正确显示。如果绝对必要,我也可以在 AHK 中使用 Perl 风格的正则表达式。]

这些正则表达式模式发现未能忽略 █:

(([^`]|█?){1,23} )
((([^`])|(█)?){1,23} )
((([^`])|(?:█)){1,23} )

那么,有没有办法做到这一点?

标签: regexnotepad++

解决方案


您可以使用以下模式:

(?:[^`█]█*){1,23}[ ]

这匹配除反引号或完整块后跟零个或多个完整块字符之外的任何字符,并允许整个内容重复 1 到 23 次。这确保了完整的块字符不计入{1,23}量词。

演示

您还可以使用 Unicode 代码点(在我看来,这看起来更好):

(?:[^`\x{2588}]\x{2588}*){1,23}[ ]

此外,如果最后一个字符(最后一个匹配)不必是空格字符,您可以使用:

(?:[^`\x{2588}]\x{2588}*){1,23}(?: |$)

推荐阅读