0
votes

Comment simplifier une expression régulière en ne réécrivant pas le même groupe de capture?

text d'entrée:

du lundi au vendredi 6h00 à 20h00

samedi au dimanche 6h30 à 20h00

J'ai besoin de faire correspondre le texte en gras afin que la RegEx suivante: xxx

Comment puis-je simplifier l'expression régulière en évitant Réécrire le (lundi | mardi | mercredi | jeudi | vendredi | Samedi | Dimanche) Capture Group deux fois?


8 commentaires

Dans quel moteur implémentez-vous cela dans?


J'utilise JavaScript


Vous devriez quitter les mécanismes pure regex et utiliser des caractéristiques de la langue environnante, par exemple. parties de la regex dans une variable textuelle. Serait-ce une option?


Hé bien oui. Je pourrais laisser capturergroup = (lundi | mardi ...) et faire laissez regex = capturegroup + '(à)' + capturegroup mais je cherchais un mécanisme de regex


Si vous n'avez pas besoin de captures individuelles et que le motif doit se produire au début de l'entrée, vous pourriez faire ^ ((((((^ ^) (lundi | mardi)) {2}


@Trincot ouais cela fonctionnera +1


Dans Perl, vous pouvez utiliser My $ rx1 = qr / (lundi | mardi | mercredi | Jeudi | Vendredi | Samedi | Dimanche) /; mon $ rx2 = qr / \ b $ RX1 \ s + to \ s + $ RX1 \ B /; qui vous empêche d'écrire une expression longue deux fois, mais l'incorpore tout simplement deux fois dans la regex opérationnelle que vous pourriez utiliser avec pendant (<>) {imprimé "1 $ - 2 \ n" si m / $ rx2 /; } . Qui imprime lundi au vendredi et samedi - dimanche sur deux lignes pour les données d'échantillonnage dans la question.


Avec PCRE, vous pouvez utiliser (? Group_number) Pour répéter le motif défini dans un groupe Démo . Malheureusement, ça ne marche pas avec JavaScript


4 Réponses :


1
votes

Vous pouvez définir une alternance de fragment de chaîne, puis la réutiliser:

p>

var input = "Monday to Friday 6:00 a.m. to 8:00 p.m.";
var alt = "(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)";
var re = new RegExp("^" + alt + " (to) " + alt + ".*$");
if (re.test(input)) {
    console.log("valid");
}
else {
    console.log("invalid");
}


6 commentaires

Ouais, comme je l'ai dit dans le commentaire que je cherchais un mécanisme de regex. Donc s'il n'y a pas d'autre que je vais recourir à cette


comme je l'ai dit est une grammaire anglaise incorrecte, à moins que vous ne me disiez que vous venez de dire "comme". Vous voulez dire "comme je l'ai dit."


Lol totalement non pertinent mais ok et j'utilise cette phrase toute ma vie. MACMillandictionary.com/dictionary/British/Like-i-Say-said < / a>


..aet il y a ce Quodb.com/Search/%22Like%20i%20Said % 22 et oui je sais que je ne peux pas commencer une phrase avec "et"


Et qu'est-ce qui vous fait penser qu'il y a une règle contre les phrases de départ avec "et"? Comme Churchill (réputé) dit, " C'est le genre de non-sens avec lequel je ne serrerai pas ". Et "Comme je l'ai dit" est parfaitement idiomatique anglais anglais - un peu informel, peut-être, mais pas incorrect. Je ne comprends pas assez américain de pontifier.


@Jonathanleffler aime comme une préposition et un adverbe est vraiment nécessaire ici. Mais rien de tout cela ne compte maintenant, car à l'avenir, nous allons tous utiliser de manière grammairienne.



0
votes

Ceci est plus court, mais aussi Ulier: xxx

bien qu'il corresponde à quelque chose comme lundi vendredi également (sans le à ) .

Je resterais certainement avec la version plus grande moi-même, pour des raisons de lisibilité.


1 commentaires

Notez que cela pourrait correspondre "à" deux fois, comme dans " du lundi au vendredi à travail"



1
votes

Si les hypothèses suivantes peuvent être effectuées:

  • Vous n'avez pas besoin de captures individuelles après que le match ait été fait
  • Le motif doit se produire au Démarrer de l'entrée

    alors vous pourriez faire:

    ^ \ b ((((à | ^) (lundi | mardi) {2} \ b

    Explication
    • ^ correspond au début de l'entrée.
    • \ b nécessite que le premier caractère soit un caractère de mots. Il est là pour empêcher la correspondance "to" au début de la chaîne.
    • {2} nécessite la partie principale pour correspondre deux fois dans une rangée
    • (à | ^) peut correspondre en théorie avec "to" ou le début de l'entrée, mais depuis la première fois que nous savons que nous sommes au début (en raison du premier code ^ ), et il ne peut pas correspondre "à" en raison du précédent \ b , il s'agit d'une opération sans fonctionnement. La deuxième fois, il ne peut plus correspondre au début de l'entrée, puisque nous avons déjà assorti un jour, alors "pour" peut correspondre à la deuxième itération.
    • \ b à la fin est là pour éviter que quelque chose comme mardimorning correspondrait.


0 commentaires

0
votes

En supposant que votre texte de recherche contient uniquement des données uniquement au format: Jour de 6h00 à 8h00 à 8h00, vous pouvez utiliser

re.findall("([A-Za-z]*day)\s(to)\s([A-Za-z]+day)","Monday to Tuesday  6:00 a.m. to 8:00 p.m")


0 commentaires