2009-03-31 15 views
1

ich so etwas wie die folgend in einer Zeichenkette haben zu ersetzen s/BEGINIGNORE * ENDIGNORE // s - nämlich alles zwischen BEGINIGNORE und ENDIGNORE auszustrippen, inklusive. Sie würden denken, die folgenden würde das in Mathematica tun:Mathematica StringReplace einen Teil enthält Zeilenumbrüche

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

Aber es funktioniert nicht. Wie mache ich das in Mathematica?

PS: Ich definiere folgendes Alias: re = RegularExpression;

Antwort

3

Es stellt sich heraus, dass aus irgendeinem Grund „[.\\s]“ und „[.\\n]“ funktionieren nicht, sondern „(.|\\n)“ der Fall ist. So sind die folgenden Werke:

strip[s_String] := StringReplace[s, [email protected]"BEGINIGNORE(.|\\n)*ENDIGNORE" -> ""] 
+0

Der Grund dafür ist, dass (in eckigen Klammern) entspricht einem Punkt, einen Schrägstrich oder ein "s" "[\ s.]" , während "(. | \ n)" mit jedem Zeichen außer einem Zeilenumbruch (der Punkt) oder einem Zeilenumbruch (das "\ n") übereinstimmt, was Sie wollen, – MarkusQ

+0

Ich sehe. Danke Markus! (Ich habe bestätigt, dass dies in Perl so funktioniert, wie ich es erwartet hatte, was ich für das vernünftigere Verhalten halte.) – dreeves

1

Versuchen:

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

Wie Sie weiterverfolgt, müssen Sie Pars statt eckigen Klammern um den Ausdruck, den Sie * wollte.

Die eckigen Klammern definieren hier wie in den meisten regulären Ausdruckssprachen eine Zeichenklasse. Deshalb funktioniert [.\\s] nicht wie erwartet, es steht für eine Menge von Zeichen und nicht für einen geklammerten Ausdruck. Vielleicht hat dich der Mathematica-Gebrauch von [] für Ausdrücke in diese Richtung gedacht?

+0

Eigentlich funktioniert es in Perl so, wie ich es erwartet habe, also mache ich hier Mathematica verantwortlich. – dreeves