8
votes

Utilisation de JavaScript Regexp pour trouver le premier match et le plus long

J'ai une réégionme comme l'exemple simplifié suivant: xxx pré>

Quand je l'exécute sur une chaîne, cela me donnera la première correspondance, FX: P>

var exp = /h..|hel*/


3 commentaires

Votre deuxième exemple serait beaucoup plus intéressant s'il s'agissait par exemple: / h .... | hel * /


Ça me ressemble. En fait, je voulais illustrer que le plus long regexp n'était pas nécessairement le plus long match. Mon expression simple aurait dû être quelque chose comme / h. *? | Bonjour / . Mais je suppose que les utilisateurs de ce site sait ce que je veux dire quand même. Au moins tu as fait :-)


Si des assertions de la veille de largeur de largeur variable étaient possibles dans JavaScript (comme ils sont par exemple dans les flavors .NET et JGSoft Regex), vous pouvez y parvenir de cette façon: exp = /.*(?<<=H..|Hel*) / . Mais jusqu'à présent, cette fonctionnalité n'est pas attendue dans JS.


5 Réponses :


4
votes

Que diriez-vous de / enfer | il / ?


3 commentaires

Ce n'est pas toujours aussi évident que dans cet exemple.


Simple mais dévastateur. :)


Cela m'a aidé. Je peux trier l'ordre de mes clauses. Problème résolu.



3
votes

Toutes les implémentations Regex que je connaissent la volonté (essayer de) correspondre aux personnages / motifs de gauche à droite et à terminer chaque fois qu'ils trouvent une correspondance surtout.

En d'autres termes: si vous voulez vous assurer d'obtenir le plus long match possible, vous devez essayer tous vos modèles (séparément), stocker tous les matchs, puis obtenir le plus long match de toutes les correspondances possibles.


1 commentaires

Je sais. J'ai édité la question. Merci d'avoir répondu. Je vais commencer par trouver l'index de la première correspondance, puis ad The ^ à chaque REGEXP et rechercher la sous-chaîne à partir de la première index, puisque cherche des expressions qui ne sont pas là-bas, les requillages fonctionnent dans tout le texte.



1
votes

Vous ne pouvez pas faire "le plus long match" (ou quoi que ce soit impliquant le comptage, moins des regards) avec des expressions régulières.

Votre meilleur pari est de trouver tous les matchs , et simplement comparer les longueurs du programme.


6 commentaires

En trouvant tous les matchs, vous voulez prendre la regex à part | et à la recherche de chaque partie individuellement? (Ainsi au lieu de chercher (A | (B (C | D)), il faudrait chercher 3 expressions: A, BC, BD. Je me demande si on doit prendre en compte également une option). Ou y a-t-il Un peu de soutien pour trouver tous les matchs?


@ Jirka-x1: Il est possible de trouver le match suivant ; Je voulais simplement dire écrire une boucle qui traverse chaque match et garde la trace dont la trace est la plus longue.


Je ne suis pas sûr de JavaScript, mais à Java, votre approche ne fonctionne pas. Matchers M = Pattern.comPile ("He | Hell"). Correspondant ("Hello World"); tandis que (m.find ()) {system.out.println (m.group ()); } produit un seul résultat: "il". Deuxièmement, les invocations ultérieures de recherche () commencent au premier caractère non apparié par l'invocation précédente.


Voir mon exemple ci-dessus (j'ai appuyé sur Entrer trop vite)


@Jirka: Si vous voulez correspondre plus longtemps si possible, utilisez l'expression régulière il (ll)?


Oui, mais vous devez en quelque sorte compiler en quelque sorte l'entrée Regex en un qui correspond à la chaîne la plus longue possible. En dehors des exemples simples tels que cela, c'est difficile. Pas même sûr que s'il est toujours possible (en supposant que l'on utilise le style habituel Perl de Regex, pas seulement des expressions régulières simples équivalentes à l'automate d'état fini).



3
votes

Vous pouvez le faire. Il est expliqué ici: http://www.regular-expressions.info/alternation.html

(en résumé, modifiez l'ordre d'opérande ou le groupe avec interrogation marquez la deuxième partie de la recherche.)


0 commentaires

1
votes

Je ne sais pas si c'est ce que vous recherchez (compte tenu de cette question, il a presque 8 ans ...), mais voici mon grain de sel:

(Changer pour l'enfer exécutera le Recherche basée sur le premier premier) xxx

où correspondance [0] va être la plus longue de toutes les chaînes assorties.


0 commentaires