2017-01-26 3 views

Répondre

1

Je sais comment faire cela avec deux regex.

celui-ci vérifie s'il y a un nombre pair de x (et au moins deux):

/^(y*xy*x)+y*$/ 

Et celui-ci vérifie s'il y a un nombre impair de y (et au moins un):

/^(x*yx*y)*x*yx*$/ 

Les deux correspondront uniquement aux chaînes formées exclusivement de x et y.

+0

+ un Notez que vos deux regex peuvent être combinées en une seule (voir la version commentée dans ma réponse). – ridgerunner

0

Je l'ai testé dans mon éditeur:

(?=([^x]*x[^x]*x[^x]*)*)(?=([^y]*y[^y]*y[^y]*)*[^y]*y[^y]*) 

Cela trouvera sous-chaînes, de sorte que vous pouvez ajouter de l'espace, en commençant, caractères de fin de ligne:

[^\s](?=([^x]*x[^x]*x[^x]*)*)(?=([^y]*y[^y]*y[^y]*)*[^y]*y[^y]*)[$\s] 

Pour le rompre vers le bas, [^x]*x[^x]*x[^x]* saisira tout non-x, jusqu'à ce qu'il trouve le premier x, puis attrape tout ce qui suit non-x jusqu'à ce qu'il trouve le deuxième x, puis saisit à nouveau tout ce qui suit jusqu'à un autre x. Ceci est inclus dans() * afin qu'il soit répété un nombre illimité de fois, de sorte qu'il trouve toutes les paires de x. S'il y a un impair x restant (impair x), l'expression rationnelle ne sera pas capable de correspondre à ce seul x gauche. De même pour le cas y, il correspond à toutes les paires de y, puis s'assure qu'il reste un seul y suivi de tous les non-y. J'ai utilisé? = Pour qu'il corresponde mais ne capture pas, de sorte que nous puissions vérifier x dans la même chaîne pour vérifier y.

0

Voici une exemple de fonction JavaScript testée implémentant une seule regex répondant à vos besoins. Je suppose que zéro est un nombre (pair) acceptable de X. L'expression régulière est documentée dans un commentaire multi-lignes.

function has_even_X_odd_Y_word(text) { 
/*#!(?#!js\/i re_even_x_odd_y Rev:20170125_2100) 
    # Match word having even count of X and odd count of Y. 
    \b  # Anchor to start of word. 
    # First assert odd, non-zero count of Ys in this word. 
    (?=  # Assert odd count of Y. 
     (?: # Zero or more or more Y pairs. 
     x*y # Optional Xs preceeding 1st Y. 
     x*y # Optional Xs preceeding 2nd Y. 
    )*  # End zero or more Y pairs. 
     x*yx* # Optional Xs around last (odd) Y. 
     \b  # Anchor to end of word. 
    )  # End assert odd count of Y. 
    # Match even number of Xs (can be zero = even). 
    (?:  # Zero or more X pairs. 
     y*x # Optional Ys preceeding 1st X. 
     y*x # Optional Ys preceeding 2nd X. 
    )*  # End zero or more X pairs. 
    y*  # Optional Ys after last (even) X. 
    \b  # Anchor to end of word. 
!#*/ 
    var re_even_x_odd_y = /\b(?=(?:x*yx*y)*x*yx*\b)(?:y*xy*x)*y*\b/i; 
    if (re_even_x_odd_y.test(text)) { return true; } 
    return false; 
} // End has_even_X_odd_Y_word(). 

La fonction retourne true si un mot de correspondance se trouve dans le texte adopté et faux autrement.