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

2023-11-27

在下面的代码中,如果字符串 s 附加到大约 10 或 20,000 个字符,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)*"->""]

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


Mathematica 使用 PCRE 语法,因此它确实具有/s aka DOTALL又名单行修饰符,你只需在前面添加(?s)修饰符位于您希望应用它的表达式部分之前。

请参阅此处的正则表达式文档:(展开标有“更多信息”的部分)
http://reference.wolfram.com/mathematica/ref/RegularExpression.html

以下为后面的所有正则表达式元素设置选项:
(?i)将大写和小写视为等效(忽略大小写)
(?m)使 ^ 和 $ 匹配行的开头和结尾(多行模式)
(?s)允许 。匹配换行符
(?-c)取消设置选项

这个修改后的输入不会使 Mathematica 7.0.1 崩溃(原来的),使用 15,000 个字符长的字符串,产生与表达式相同的输出:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mathematica 中的错误:正则表达式应用于很长的字符串 的相关文章

随机推荐