UltraEdit 替换功能超出可用资源

UltraEdit Replace function exceeds available resources

我的小宏的目标是找到第 1000 行,并向其附加一个无意义的字符串,这样我就可以转置数据并在行值之间添加逗号。

我找到了替换功能的搜索词:((.+?\r\n){1000}) 我替换为:ZZZZZ

当我的行数少于 2500 行时,一切正常。如果我超过了这个数字(它是近似值),我会收到一条错误消息:匹配表达式的复杂性已超出可用资源。 Google 就这个特定问题给了我大约 3 个结果,其中一个是关于 Whosebug 的,但它似乎专注于一个非常不同的主题。主题:(Different results for unicode/multibyte modifier and mb_ereg_replace)

有人可以告诉我为什么会出现此错误以及如何解决它,或者可以用不同的方法将 "ZZZZZ" 附加到我的数据集中的每 1000 行吗?

marking/capturing 组中的 marking/capturing 组导致未定义的行为,这几乎总是不是预期的结果。

正确的 Perl 正则表达式搜索字符串应该是:^((?:.+?\r\n){1000})

由于左括号后 ?:,内部组现在是非标记组。内部组仅被定义为能够应用乘数表达式,因此不应标记某些内容,即复制堆栈上找到的字符串以通过反向引用重新使用。

以后注意事项:
?+*{n}{n,}{n,m} 等乘数应用于标记组总是错误的。

使用.*(除换行符以外的任何字符0次或多次)或.+(除换行符以外的任意字符1次或多次)给出Perl正则表达式也很重要引擎一个锚点,从哪里开始,从哪里结束匹配的字符。匹配字符的结束由 \r\n 定义。但是匹配字符的开头未在您的搜索表达式中定义。这就是我添加 ^ ... 行首的原因。我经常看到使用 .*.+ 时出现意想不到的 find/replace 结果,而没有在搜索字符串中指定匹配字符的开始和结束位置。

此搜索表达式与回车 return 和换行完全匹配 1000 行,使用 </code> 或 <code> 可用于向后引用此块并插入 在下一行 字符串 ZZZZZ.

但是 ZZZZZ 应该插入到每第 1000 行的末尾,而不是下一行的开头。

因此需要此搜索表达式:^((?:.*?\r\n){999}.*)$

替换字符串为 ZZZZZZZZZZ

每次搜索都从行首开始的搜索字符串 - 此处非常重要 - 匹配 999 行,每行包含 0 个或更多字符,且每行包含 0 个或更多字符 greedy 在第 1000 行,但不包括换行符回车 return 和换行符。 $ 也适用于 Perl 正则表达式引擎的文件结尾。因此,此 Perl 正则表达式搜索字符串也适用于恰好 5000 行的文件,其中最后一行没有行终止。

为什么 ^ 这里对于获得正确的结果很重要?

在每第 1000 行的末尾插入 ZZZZZ 后,当前位置在第 1000 行的末尾,紧接在该行的回车 return 和换行之前。如果没有 ^,搜索将从当前第 1000 行的匹配 \r\n.* ... 0 或更多)开始,而不是从开始下面的下一行。