Regex pour supprimer tous les espaces, sauf les mots-clés autour et entre guillemets

gloire sauvage:

Je veux:

  1. 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é)

  2. 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.replaceAllen 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.

Wiktor Stribiżav:

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.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=312487&siteId=1
conseillé
Classement