2009-03-31 4 views
1

J'ai quelque chose comme ce qui suit dans une chaîne:Mathematica StringReplace pour remplacer une sous-chaîne contenant les nouvelles lignes

blah blah 

BEGINIGNORE 
    this stuff should get stripped out 
ENDIGNORE 

more stuff here 

Je voudrais faire (syntaxe perl):. S/BEGINIGNORE * ENDIGNORE // s - à savoir, dépouiller tout entre BEGINIGNORE et ENDIGNORE, inclusivement. Vous penseriez ce qui suit ferait que Mathematica:

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

Mais il ne fonctionne pas. Comment est-ce que je fais ceci dans Mathematica?

PS: Je définir l'alias suivant: re = RegularExpression;

Répondre

3

Il se trouve que pour une raison quelconque « [.\\s] » et « [.\\n] » ne fonctionnent pas, mais « (.|\\n) » fait. Ainsi, les travaux suivants:

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

La raison est que (entre crochets) correspond à un point, une barre oblique, ou un "s" "[\ s.]" , alors que "(. | \ n)" correspond à n'importe quel caractère sauf un saut de ligne (le point) ou un saut de ligne (le "\ n"), ce que vous voulez, – MarkusQ

+0

je vois. Merci Markus! (J'ai confirmé que dans Perl cela fonctionne comme je m'y attendais, ce qui me semble être le comportement le plus raisonnable.) – dreeves

1

Essayer:

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

Comme vous avez suivi, vous avez besoin parens plutôt que des crochets autour de l'expression que vous vouliez *.

Les crochets définissent une classe de caractères ici, comme dans la plupart des langages d'expression régulière. C'est pourquoi [.\\s] ne fonctionne pas comme prévu, il représente un ensemble de caractères plutôt qu'une expression entre parenthèses. Peut-être que l'utilisation de Mathematica de [] pour les expressions vous a amené à penser dans cette direction?

+0

En fait, en Perl cela fonctionne comme je m'y attendais donc je blâme Mathematica ici. – dreeves

Questions connexes