7
votes

Regex correspondant à 0 ou plusieurs instances de mots clés, dans n'importe quel ordre

Je suis honnête avec regexes mais déconcerté ici. Je vais avoir du mal avec le groupe 2 strong>, ci-dessous. Cependant, je pense que cela devrait être assez facile pour un gourou ... regex

Problème h2>

Je suis en train de faire correspondre zéro ou plusieurs instances d'un ensemble de mots-clés, dans l'ordre p>


[Mise à jour: Pour référence future]
La solution la plus simple (dérivé de 'de réponse) est: em> ! ((keyword1 | keyword2 | mot clé3) *) code> p>

Note: l'espace après chaque mot est essentiel em> p>

Dans mon cas, cela se traduit par: em> ((statique | final) *) code> p>

c'est est le bare-bones, réponse la plus simple. La meilleure approche, plus panda noir la réponse ", ci-dessous. Il permet une quantité d'espaces et est plus rapide pour un moteur de RE à traiter. Em> p>


Entrée h2>

Je dois diviser l'entrée suivante en groupes très spécifiques . P>

Remarque: les chiffres ne font pas partie de l'entrée. Autrement dit, chaque ligne d'entrée commence par la lettre p. Em> p>

  1. public static final int UN = 1; li>
  2. public final static int DEUX = 2; li>
  3. public final int TROIS = 3; li>
  4. public static int QUATRE = 4; li>
  5. int privé CINQ = 5; li> Ol>

    Groupes h2>

    Je dois briser l'entrée en groupes de match tels que p>

    1 groupe =
    public ou privé ou protégé groupe 2 = 0 ou plusieurs instances de "statique" ou "définitif" strong> strong> groupe 3 = type de données
    groupe 4 = nom de la variable
    groupe 5 = valeur p>

    Groupe 2 Détails h2>

    Compte tenu de l'entrée ci-dessus, un groupe 2 serait la suivante: p>

    1. static final li>
    2. statique finale li>
    3. finale li>
    4. statique li>
    5. [chaîne vide] li> Ol>

      Failed Solutions h2>

      est le regex je suis venu avec et id ne fonctionne pas pour le groupe 2: p>

      ^.*(public|private|protected)\s+(static\s+|final\s+)*\s+([^ ]+)\s+([^ ]+)\s*(;|=)(.*)$
      
      • (statique \ s + | + finale de \ s) * li>
      • (statique | final) * \ s + li>
      • (statique | final) * li>
      • (statique \ | finale \) * li> Ul>

        Résumé h2>

        Quelle devrait être l'expression régulière pour « groupe 2 » qui correspond à une ou plusieurs instances des mots « statique » ou « finale ». Une solution appropriée serait extensible pour correspondre à tout sous-ensemble de tous les mots tels que [statique, final, transitoire, volatile]. P> p>


2 commentaires

À la personne qui a signalé cette question comme "trop ​​localisée": correspondant à zéro ou plus d'instances d'un sous-ensemble de mots est extrêmement puissante et utile de manière générique. En fait, si je trouve une réponse à cela, je peux penser à des dizaines d'autres endroits pour l'utiliser.


Quel est le résultat final que vous essayez d'accomplir? Qu'essayez-vous d'extraire


4 Réponses :


0
votes

Vous pouvez essayer: xxx

le voir


0 commentaires

0
votes

Ceci correspond à zéro ou plusieurs instances des mots "statiques" ou "finale": xxx

Comme vous pouvez le voir à partir de ces extraits de Perl: xxx

Si vos matchs ne fonctionnent pas, le problème est probablement ailleurs ailleurs


2 commentaires

pas exactement. Dans votre exemple, au lieu de faire correspondre "finale statique", vous correspondez à "statique". Ce qui signifie que si je substitue (statique | finale) dans la plus longue regex supérieure, il correspondra aux entrées 3-5 mais ne correspond pas aux entrées 1 et 2 ...


Ah, je vois. @ La solution de REFP serait la voie à suivre.



2
votes

Pouvez-vous tout attraper entre entre -bures et vous assurer que les groupes 3 et plus existent?

groupe 2 = (((? :( ?: statique | Final | Transient | Volatile) \ S +) *)


8 commentaires

Cela a parfaitement travaillé pour moi et est assez élégant et décemment performant (n'a pas pris beaucoup de temps). Je vais tester cela un peu plus mais je pense que c'est ce dont j'ai besoin.


Ce qui précède n'est pas correct cependant, il correspondra à la "finale finale" "finale finale statique", etc.


Testé cela un peu plus et ça a l'air bien mais je ne comprends pas ça. Pourquoi avons-nous besoin du deuxième groupe de non-capture? À un niveau élevé, comment cela fonctionne-t-il?


@gmale Le groupe externe non capturant attrape toutes les combinaisons des mots statiques, finales, transitoires et volatiles qui existent, y compris l'espace qui sépare le mot du mot suivant à venir. Le groupe interne non capturant attrape un seul mot.


Le groupe externe capture l'ensemble du shebang.


Grande explication. Une question: pourquoi avons-nous besoin des groupes non capturants? Signification, pourquoi cela ne fonctionne-t-il pas lorsque nous supprimons le?: Pièces? Est-ce que ... nous voulons que cela correspond à chaque mot, mais ne les consommez pas. Ensuite, nous voulons que cela correspond à plusieurs instances de chaque mot et ne les consommez pas? Ensuite, le groupe le plus externe fait la consommation finale de l'ensemble du shebang?


Cela fonctionne sans le?: Pièces; Je viens de les ajouter généralement lorsque je ne veux pas que le moteur d'expression régulier reste une trace des captures inutiles. Il est plus efficace pour le moteur RE.


Merci, Gmale :) @Refp Ma réponse à votre commentaire est toujours debout. Votre expression échoue toujours d'une certaine séquence de la déclaration de déclaration, mais c'est bon, car l'OP n'a jamais demandé qu'il soit assez compliqué pour correspondre exactement à ce qu'un compilateur. J'accepte votre -1 tant que l'OP est satisfait. Bonne journée :)



1
votes

Du: xxx

sortie: xxx


1 commentaires

Remarque: cela correspondra à «statique statique» et «finale finale statique».