Je veux:
supprimer tous les espaces blancs à moins qu'elle soit juste avant ou après (0-1 espace avant et après 0-1) les mots-clés prédéfinis (par exemple: et, ou, si nous laissons les espaces « et » ou « et » ou « et » inchangé)
entre guillemets ignorer tout
J'ai essayé beaucoup de modèles. Le plus proche que je suis venu avec est assez proche, mais il supprime encore l'espace après les mots clés que je suis en train d'éviter.
regex:
\s(?!and|or|if)(?=(?:[^"]*"[^"]*")*[^"]*$)
Chaîne d'essai:
if (ans(this) >= ans({1,2}) and (cond({3,4}) or ans(this) <= ans({5,6})), 7, 8) and {111} > {222} or ans(this) = "hello my friend and or " and(cond({1,2}) $1 123
Idéal résultat:
if (ans(this)>=ans({1,2}) and (cond({3,4}) or ans(this)<=ans({5,6})),7,8) and {111}>{222} or ans(this)="hello my friend and or " and(cond({1,2})$1123
Je peux alors utiliser str = str.replaceAll
en Java pour supprimer ces espaces. Je ne me dérange pas de faire plusieurs étapes pour obtenir le résultat, mais je ne suis pas familier avec regex donc un peu coincé.
Toute aide serait appréciée!
Note: J'ai modifié le résultat. Désolé pour ça. Pour l'espace autour des mots clés: réduit à 1 s'il y a des espaces. Soit laisser ou ajouter 1 place si elle est 0 (je ne veux pas « ou ans » devient « orante », mais « et (cond » devient « et (cond) » est très bien (réduire à 1 espace avant et 1 espace après si elle existe). Ignorer tout entre guillemets.
Vous pouvez utiliser
String example = " if (ans(this) >= ans({1,2}) and (cond({3,4}) or ans(this) <= ans({5,6})), 7, 8) and {111} > {222} or ans(this) = \"hello my friend and or \" and(cond({1,2}) $1 123 ";
String rx = "\\s*\\b(and|or|if)\\b\\s*|(\"[^\"]*\")|(\\s+)";
Matcher m = Pattern.compile(rx).matcher(example);
example = m.replaceAll(r -> r.group(3) != null ? "" : r.group(2) != null ? r.group(2) : " " + r.group(1) + " ").trim();
System.out.println( example );
Voir la démo Java .
Les matchs de motif
\s*\b(and|or|if)\b\s*
- 0+ espaces blancs, limite de mot, Groupe 1:and
,or
,if
, limite de mot, puis 0+ espaces blancs|
- ou(\"[^\"]*\")
- Groupe 2:"
, tout autre que 0+ caractères"
et un"
|
- ou(\s+)
- Groupe 3: 1+ espaces blancs.
Si le groupe 3 matches, ils sont supprimés, si le groupe 2 matches, il est remis dans le résultat et si le groupe 1 matches, il est enveloppé avec des espaces et recollé. Le résultat est tout .trim()
ed.