2010-10-20 6 views
1

J'ai essayé de faire ce Regex pendant un moment maintenant. Je voudrais en créer un qui corresponde à tous les espaces d'un texte, sauf ceux qui sont en chaîne littérale.Regex qui correspond à des espaces spécifiques

Exemple:

123 Foo "String avec des espaces"

espace entre 123 et Foo correspondrait, ainsi que celle entre Foo et "String avec des espaces", mais seulement ces deux.

Merci

+0

alors quelle devrait être votre sortie? – ghostdog74

Répondre

1

Une stratégie commune, simple pour cela est de compter le nombre de citations qui ont précédé votre position dans la chaîne. Si le nombre est impair, vous êtes dans une chaîne entre guillemets; Si le montant est pair, vous êtes en dehors d'une chaîne entre guillemets. Je ne peux pas penser à un moyen de le faire dans les expressions régulières, mais vous pouvez utiliser cette stratégie pour filtrer les résultats.

+0

Je pense que vous avez raison. Regex ne peut pas me sauver cette fois, car il ne peut pas compter une occurrence de personnage. Merci – Frank

1

Vous pouvez utiliser re.findall pour correspondre à une chaîne ou un espace, puis inspecter ensuite les matches:

import re 
hits = re.findall("\"(?:\\\\.|[^\\\"])*\"|[ ]", 'foo bar baz "another\\" test\" and done') 
for h in hits: 
    print "found: [%s]" % h 

Rendement:

found: [ ] 
found: [ ] 
found: [ ] 
found: ["another\" test"] 
found: [ ] 
found: [ ] 

Une brève explication:

"   # match a double quote 
(?:  # start non-capture group 1 
    \\\\. # match a backslash followed by any character (except line breaks) 
    |  # OR 
    [^\\\"] # match any character except a '\' and '"' 
)*   # end non-capture group 1 and repeat it zero or more times 
"   # match a double quote 
|   # OR 
[ ]  # match a single space 
0

Si ceci -> 123 Foo "Chaîne avec des espaces" < - est votre structure pour un ligne c'est-à-dire texte suivi d'un texte cité vous pouvez créer 2 groupes le texte cité et non coté et les aborder séparément.

ex.regex ->(.*)(".*") où 1 $ doit contenir -> 123 Foo < - et 2 $ -> "String avec des espaces" < -

exemple java.

String aux = "123 Foo \"String with spaces\""; 
    String regex = "(.*)(\".*\")"; 
    String unquoted = aux.replaceAll(regex, "$1").replace(" ", ""); 
    String quoted = aux.replaceAll(regex, "$2"); 
    System.out.println(unquoted+quoted); 

Exemple javascript.

<SCRIPT LANGUAGE="JavaScript"> 
    <!-- 
    str='1 23 Foo \"String with spaces\"'; 
    re = new RegExp('(.*)(".*")') ; 
    var quoted = str.replace(re, "$1"); 
    var unquoted = str.replace(re, "$2"); 
    document.write (quoted.split(' ').join('')+unquoted); 
// --> 
</SCRIPT> 
Questions connexes