Mathematica StringReplace替换包含换行符的子字符串

时间:2009-03-31 21:34:01

标签: regex string wolfram-mathematica

我在字符串中有以下内容:

blah blah

BEGINIGNORE
   this stuff should get stripped out
ENDIGNORE

more stuff here

我想这样做(perl语法):s / BEGINIGNORE。* ENDIGNORE // s - 即删除BEGINIGNORE和ENDIGNORE之间的所有内容。 您会认为以下内容会在Mathematica中执行此操作:

StringReplace[str, re["BEGINIGNORE[.\\s]*ENDIGNORE"]->""]

但事实并非如此。我如何在Mathematica中做到这一点?

PS:我定义了以下别名:re = RegularExpression;

4 个答案:

答案 0 :(得分:3)

事实证明,由于某些原因,“[.\\s]”和“[.\\n]”不起作用,但“(.|\\n)”不起作用。以下是有效的:

strip[s_String] := StringReplace[s, re@"BEGINIGNORE(.|\\n)*ENDIGNORE" -> ""]

答案 1 :(得分:1)

尝试:

StringReplace[str, re["BEGINIGNORE(.|\\n)*ENDIGNORE"]->""]

答案 2 :(得分:1)

在正则表达式中插入(?s)修饰符。这相当于Perl的/s修饰符,是标准PCRE语法的一部分。

StringReplace[str, re["BEGINIGNORE(?s).*ENDIGNORE"]->""]

相关问题的答案中的更多细节: Bug in Mathematica: regular expression applied to very long string

答案 3 :(得分:0)

当你跟进时,你需要parens而不是方括号围绕你想要*的表达式。

方括号在此定义一个字符类,就像在大多数正则表达式语言中一样。这就是为什么[.\\s]没有按预期工作的原因,它代表一组字符而不是带括号的表达式。也许Mathematica使用[]表达式会让你思考这个方向吗?