Mathematica中的错误:正则表达式应用于非常长的字符串

dre*_*ves 10 regex string wolfram-mathematica

在下面的代码中,如果字符串s被追加为10或2万个字符,则Mathematica内核会出错.

s = "This is the first line.
MAGIC_STRING
Everything after this line should get removed.
12345678901234567890123456789012345678901234567890123456789012345678901234567890
12345678901234567890123456789012345678901234567890123456789012345678901234567890
12345678901234567890123456789012345678901234567890123456789012345678901234567890
12345678901234567890123456789012345678901234567890123456789012345678901234567890
12345678901234567890123456789012345678901234567890123456789012345678901234567890
...";

s = StringReplace[s, RegularExpression@"(^|\\n)[^\\n]*MAGIC_STRING(.|\\n)*"->""]
Run Code Online (Sandbox Code Playgroud)

我认为这主要是Mathematica的错,我已经提交了一份错误报告,如果得到回复,我会在这里跟进.但我也想知道我是否以愚蠢/低效的方式做这件事.即使不是,也应该赞赏解决Mathematica错误的想法.

Mic*_*lat 8

Mathematica使用PCRE语法,因此它确实具有/saka DOTALLaka Singleline修饰符,您只需(?s)在您希望它应用的表达式部分之前添加修饰符.

请参阅此处的RegularExpression文档:(展开标有"更多信息"的部分)
http://reference.wolfram.com/mathematica/ref/RegularExpression.html

以下为其后面的所有正则表达式元素设置选项:
(?i)将大写和小写视为等效(忽略大小写)
(?m)make ^和$ match开始和结束行(多行模式)
(?s)允许.匹配换行未
(?-c) 设置的选项

这个修改过的输入不会让Mathematica 7.0.1崩溃(原始版本),使用长度为15,000个字符的字符串,产生与表达式相同的输出:

s = StringReplace[s,RegularExpression@".*MAGIC_STRING(?s).*"->""]

由于@AlanMoore解释的原因,它也应该快一点