Notepad++ 非连续行重复查找器正则表达式中的反向引用错误
Backreference Bug in Notepad++ Non-Consecutive Line Duplication Finder Regex
Notepad++ find/replace 在使用反向引用查找不一定连续的重复行时的行为中似乎存在错误。我想知道是否有人知道正则表达式可能存在什么问题,或者他们是否知道正则表达式引擎可能出现故障的原因?
详情
我想使用正则表达式在 Notepad++ 中查找重复行。重复项不一定是连续的,即在连续的行上,中间可以有行。我从这个开始 post:
https://medium.com/@heitorhherzog/compare-sort-and-delete-duplicate-lines-in-notepad-2d1938ed7009
但意识到那里提到的正则表达式只检查连续的重复项。所以我写了自己的正则表达式:
^(.+)$(?:(?:\s|.)+)^()$
上面基本上是在整行上捕获一些东西,然后匹配中间的一堆东西,然后在一行上捕获相同的东西。
怎么了
正则表达式有效,但只是有时有效。我无法弄清楚模式。到目前为止,我已经把它缩减到这个程度。如果我在替换模式 </code> 上执行 "Replace All",那么 "replace all" 只剩下第 3 行,即 "elative backreferences32"。这是错误的:</p>
<pre><code>dasfdasfdsfasdfasdfadsfasdf
elative backreferenceswe
elative backreferences32
elative backreferencesd
elative backreferencdesdfdasdfsdafsd
asfasdfasdfasdfasdfasfdsaasdfas
asdfasdfafds asdfasfdsafasd asdfdasfsd
elative backreferencessfhdfg
x
y
x
但是如果我从该文件中删除 any 行,那么只有连续的行 x
然后 y
然后 x
被替换为如我所料,只有一行 xx
。
备注
- 我想把这个问题主要集中在为什么正则表达式是
窃听。关于查找重复项的替代方法的建议
线条当然很好,但我问这个的主要原因是
弄清楚正则表达式和 Notepad++ 是怎么回事。
- 我真的不需要这个的替换部分,只需要查找,我只是使用替换来尝试找出正在捕获哪些组以尝试调试这个
- 查找行为也有问题。我实际上首先注意到了这一点。它首先找到我实际要查找的匹配项,然后如果我再次单击 "Find Next",它会突出显示所有文本。
假设
- Notepad++ v7.8.4 64 位存在错误。我今天刚更新,所以他们可能还没有发现它。
- 匹配的中间部分,
(?:(?:\s|.)+)
,也许循环
绕过文件末尾字符并循环回到
原配?如果是这样,我会说这仍然是一个错误,因为据我所知
正则表达式应该只消耗每个字符一次。
- 我认为文件中的字符数可能有限制,但我通过摆弄文件、到处添加字符来推翻了这个假设。具有相同行数和相同字符数的两个文件可能表现不同:一个有错误行为,一个没有。
截图
之前
在没有匹配换行之后(预期配置)
匹配换行符后(用于实验)
(?:\s|.)
应该避免,因为它会导致意外行为,我建议改用 [\s\S]
:
- 查找内容:
^(.+)$[\s\S]+?^()$
- 替换为:
Notepad++ find/replace 在使用反向引用查找不一定连续的重复行时的行为中似乎存在错误。我想知道是否有人知道正则表达式可能存在什么问题,或者他们是否知道正则表达式引擎可能出现故障的原因?
详情
我想使用正则表达式在 Notepad++ 中查找重复行。重复项不一定是连续的,即在连续的行上,中间可以有行。我从这个开始 post:
https://medium.com/@heitorhherzog/compare-sort-and-delete-duplicate-lines-in-notepad-2d1938ed7009
但意识到那里提到的正则表达式只检查连续的重复项。所以我写了自己的正则表达式:
^(.+)$(?:(?:\s|.)+)^()$
上面基本上是在整行上捕获一些东西,然后匹配中间的一堆东西,然后在一行上捕获相同的东西。
怎么了
正则表达式有效,但只是有时有效。我无法弄清楚模式。到目前为止,我已经把它缩减到这个程度。如果我在替换模式 </code> 上执行 "Replace All",那么 "replace all" 只剩下第 3 行,即 "elative backreferences32"。这是错误的:</p>
<pre><code>dasfdasfdsfasdfasdfadsfasdf
elative backreferenceswe
elative backreferences32
elative backreferencesd
elative backreferencdesdfdasdfsdafsd
asfasdfasdfasdfasdfasfdsaasdfas
asdfasdfafds asdfasfdsafasd asdfdasfsd
elative backreferencessfhdfg
x
y
x
但是如果我从该文件中删除 any 行,那么只有连续的行 x
然后 y
然后 x
被替换为如我所料,只有一行 xx
。
备注
- 我想把这个问题主要集中在为什么正则表达式是 窃听。关于查找重复项的替代方法的建议 线条当然很好,但我问这个的主要原因是 弄清楚正则表达式和 Notepad++ 是怎么回事。
- 我真的不需要这个的替换部分,只需要查找,我只是使用替换来尝试找出正在捕获哪些组以尝试调试这个
- 查找行为也有问题。我实际上首先注意到了这一点。它首先找到我实际要查找的匹配项,然后如果我再次单击 "Find Next",它会突出显示所有文本。
假设
- Notepad++ v7.8.4 64 位存在错误。我今天刚更新,所以他们可能还没有发现它。
- 匹配的中间部分,
(?:(?:\s|.)+)
,也许循环 绕过文件末尾字符并循环回到 原配?如果是这样,我会说这仍然是一个错误,因为据我所知 正则表达式应该只消耗每个字符一次。 - 我认为文件中的字符数可能有限制,但我通过摆弄文件、到处添加字符来推翻了这个假设。具有相同行数和相同字符数的两个文件可能表现不同:一个有错误行为,一个没有。
截图
之前
在没有匹配换行之后(预期配置)
匹配换行符后(用于实验)
(?:\s|.)
应该避免,因为它会导致意外行为,我建议改用 [\s\S]
:
- 查找内容:
^(.+)$[\s\S]+?^()$
- 替换为: