Macros UltraEdit替换功能超出了可用资源
我的小宏的目标是找到第1000行,并在其中附加一个无意义字符串,这样我就可以转换数据并在行值之间添加逗号 我找到了替换函数的搜索项:((.+?\r\n){1000}) 我将替换为:ZZZZZ 当我的行数少于2500行时,一切正常。如果我超过了这个数字(它是近似值),我会得到一个错误:匹配表达式的复杂性超过了可用资源。谷歌给了我3个关于这个具体问题的结果,其中一个是关于stackoverflow的,但它似乎关注的是一个非常不同的主题。主题:()Macros UltraEdit替换功能超出了可用资源,macros,ultraedit,Macros,Ultraedit,我的小宏的目标是找到第1000行,并在其中附加一个无意义字符串,这样我就可以转换数据并在行值之间添加逗号 我找到了替换函数的搜索项:((.+?\r\n){1000}) 我将替换为:ZZZZZ 当我的行数少于2500行时,一切正常。如果我超过了这个数字(它是近似值),我会得到一个错误:匹配表达式的复杂性超过了可用资源。谷歌给了我3个关于这个具体问题的结果,其中一个是关于stackoverflow的,但它似乎关注的是一个非常不同的主题。主题:() 有人能告诉我为什么会出现此错误以及如何修复它,或者以
有人能告诉我为什么会出现此错误以及如何修复它,或者以不同的方式将“ZZZZZ”附加到数据集中的每1000行吗?标记/捕获组中的标记/捕获组会导致未定义的行为,而这几乎总是不是预期的结果 正确的Perl正则表达式搜索字符串应该是:
^((?:.+?\r\n){1000}
内部组现在是非标记组,因为左括号后面有?:
。内部组的定义只是为了能够应用乘法器表达式,因此不应标记某些内容,例如,复制堆栈上找到的字符串,以便通过反向引用重复使用
未来注意事项:在标记组上应用像
?
,+
,*
,{n}
,{n,}
,{n,m}
这样的乘数总是错误的
使用*
(除换行符以外的任何字符0次或更多次)或+
(除换行符以外的任何字符1次或更多次)为Perl正则表达式引擎提供起始位置和结束匹配字符的锚点也很重要。匹配字符的结束由\r\n
定义。但在搜索表达式中未定义匹配字符的开头。这就是我添加^
的原因。。。一行的开头。我经常在使用*
或+
时看到意外的查找/替换结果,但没有在搜索字符串中指定匹配字符的开始和结束位置
此搜索表达式与回车符和换行符完全匹配1000行,使用$1
或\1
可用于反向引用此块并在下一行插入
但是ZZZZZ
应该插入到每1000行的末尾,而不是下一行的开头
因此,需要此搜索表达式:^((?:.*?\r\n){999}.*$
替换字符串是\1ZZZZZ
或$1ZZZZZ
在行首开始每次搜索的搜索字符串-此处非常重要-匹配999行,每行0个或更多字符,第1000行0个或更多字符贪婪,直到但不包括换行符回车符和换行符<代码>$也适用于Perl正则表达式引擎的文件结尾。因此,这个Perl正则表达式搜索字符串也适用于一个正好有5000行的文件,其中最后一行没有行终止
为什么这里的^
对于获得正确的结果非常重要
在每1000行末尾插入
ZZZZZ
后,当前位置位于该行回车和换行之前的第1000行末尾。如果没有^
,搜索将以匹配当前第1000行的\r\n
(*
..0或更多)开始,而不是在下面下一行的开头。Mofi,我只是有一个后续问题;你测试过这段代码吗?我在我的小集合(3.5K)上尝试了它,但它仍然给了我相同的错误。我在一个文件上测试了Perl正则表达式Replace All,该文件有超过100.000行,其中每行只包含几个字符。由于此表达式需要在堆栈上推送1000行,而堆栈的大小有限,所以若此方法有效,则取决于行的长度。我可以提供一个宏或脚本解决方案,在堆栈上根本不复制任何数据。但如果您能在UltraEdit论坛中解释任务并提供示例数据,我们会寻找重新格式化文件的最佳方法,这可能会更好。啊,谢谢。每行有14个字符长。示例:AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012 AA123456789012AA123456789012 AA123456789012I使用UE v22.20.0.49创建了一个包含211202行的文本文件,其中包含上述注释中的14个字符串,并执行了一个Perl正则表达式,将所有内容替换为搜索字符串^((?:.*\r\n){999}.*)$
和replace string\1ZZZZZ
并在不到一秒钟的时间内显示了在replace对话框中被替换的211个项目。因此,正则表达式替换所有工作都很完美。