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é?
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. –