2012-04-28 2 views
1

Je m'exerce sur mes lookarounds regex et, pour ce faire, j'essaie d'extraire le nom de la table à partir d'une instruction d'insertion SQL. J'ai le regex (?<=INSERT INTO)\w+(?= (\(|VALUES).+) et je le teste sur la chaîne INSERT INTO tests VALUES (regex, test). Bien que je sache que mon regex n'est pas méticuleusement fait, je m'attends à ce qu'il corresponde à la sous-chaîne tests de mon entrée. J'utilise le moteur de regex de Java et j'imprime les résultats de ce qui se passe quand je String.split sur une regex et quand je Pattern.matches sur une regex. J'obtiens ce qui suit, en apparence contredisant les résultatsRegex: String.split et Pattern.matches ne sont pas en accord les uns avec les autres

regex> (?<=INSERT INTO)\w+(?= (\(|VALUES).+) 
string> INSERT INTO tests VALUES (regex, test) 
[INSERT INTO , VALUES (regex, test)] 
regex> (?<=INSERT INTO)\w+(?= (\(|VALUES).+) 
string> INSERT INTO tests VALUES (regex, test) 
false 

Maintenant juste pour cela sur le dossier, le code qui a produit le premier résultat est

Arrays.toString(searchString.split(regex)) 

tandis que le second est venu de

Pattern.matches(regex, searchString) 

N'est-il pas que split sépare une chaîne sur les correspondances à son argument? Cela signifie que l'expression rationnelle correspond à tests, d'où le résultat [INSERT INTO , VALUES (regex, test)]. Alors, pourquoi Pattern.matches est-il retourné faux? Quelque chose m'a manqué?

+0

Est-ce que 'Pattern.matches' n'est pas utilisé pour faire correspondre la chaîne entière? Dans votre cas, les lookarounds ne sont pas vraiment «correspondants», mais testent. –

Répondre

1

Juste pour ajouter un peu à la réponse de Joanna: Lookaheads et lookbehinds ne participent pas au match. Pattern.matches requiert que la regex corresponde au début de la chaîne jusqu'à la fin. Puisque vous avez un lookbehind positif (INSERT INTO), le match commence à text qui n'est pas au début. De même, le lookahead à la fin signifie qu'il n'y a pas de match à la fin non plus.

split fonctionne comme prévu car il ne nécessite pas la correspondance pour commencer au début.

4

Je voudrais essayer si vous avez le même problème si vous utilisez:

Pattern p = Pattern.compile(yourRegex); 
Matcher m = p.matcher(inputString); 

et vérifier si m.find() renvoie true

Pattern.matches attend toute la chaîne de match - il pourrait avoir un problème avec les lookarounds comme il s'agit d'assertions de largeur nulle, les caractères correspondants sont supprimés.

+0

Merci pour la réponse, mais j'ai trouvé plus instructif d'alan. (-,) – skytreader

Questions connexes