2009-10-20 15 views
0

Si j'ai une chaîne telle queRegex question match

lotsofcrap "somethingimportant" moreotherstuff

est-il possible d'obtenir Regex pour correspondre à peu tout ce qui est entre le "", Compte non tenu les guillemets? Donc, la façon de détecter ce serait quelque chose comme «* », mais retournera « somethingimportant » plutôt que pur somethingimportant

Répondre

4
"(.*)" 

Vous pouvez utiliser parenthese pour créer un groupe de capture. La manière dont vous y accédez dépend de la langue/bibliothèque que vous utilisez. En général, les groupes de capture sont disponibles en $1 ou en \1 dans les langages Perl. Par exemple, en Perl:

'hello "world" !!!' =~ /"(.*)"/; 
print "$1\n"; 
+0

+1 me battra 27 secondes :) – si618

+0

en fait, il ne résout pas le pro blem complètement, puisque le groupe ne contiendra pas les parenthèses. – si618

+0

Merci, c'est ce que je cherchais. – mike

1

Si votre moteur regex prend en charge les assertions de longueur nulle (regarder autotractées et regardez-) discontinues effectuées,

(?<=")[^"]*(?=") 

va correspondre à une séquence de caractères non-citation, où il se produit un devis avant et après un devis.

Cependant, c'est idiot. Vous devez simplement

"([^"]*)" 

tout match, y compris les guillemets, puis tirez le groupe 1 (l'ensemble des parenthèses) hors du match.

1

Essayez "(.*?)"

Le ? signifie que le .* élargira au besoin (jusqu'à ce qu'elle corresponde à la suivante) » dans ce cas)

du code Java.:

static String regex = "\"(.*?)\""; 
static Pattern p = Pattern.compile(regex); 

public static List<String> getMatches(String inputText) { 
    Matcher m = p.matcher(inputText); 
    List<String> list = new ArrayList<String>(); 
    while(m.find()){ 
     list.add(m.group(1)); 
    } 
    return list; 
}