Je veux faire correspondre des cordes entre parenthèses (y compris les parens elles-mêmes) et correspond également à des cordes lorsqu'une parenthèse de fermeture ou d'ouverture est manquante. P>
de regarder autour de ma solution idéale impliquerait une regex conditionnelle, mais je dois travailler dans les limites du moteur REGEX de JavaScript. P>
Ma solution actuelle qui fonctionne presque: pourrait aider à comprendre ce que j'essaie d'atteindre par exemple ( Voici un lien vers les tests que j'ai mis en place dans Regexr.com . P> / \ (? [^ ()] + \) | \ ([^ ()] + / g code>. Je pourrais être mieux pour la lisibilité) mais je suis curieux de savoir s'il existe un moyen de le réaliser sans être trop verbeux avec plusieurs | code>'s. p>
Exemples H2>
en surbrillance les sections code> sont les parties que je veux correspondre): p>
(paren sans fermeture code> li>
(paren in démarrage) code> de chaîne li>
(au milieu) code> de chaîne li>
(à la fin de la chaîne) code> li>
paren sans ouverture) code> li>
(chaîne avec seulement paren) code> li>
(avec plusieurs) code> parens (dans une rangée) code> li>
ol>
3 Réponses :
Je pense que vous avez bien fait. La question est que vous devez faire correspondre [()] à deux endroits et une seule d'entre elles doit être vraie, mais les deux ne peuvent pas être fausses et la regex n'est pas si intelligente de garder l'état comme ça. Donc, vous devez vérifier s'il y a 0 ou 1 ouverture ou 0 ou 1 fermeture dans des alternatives telles que vous avez.
mise à jour: p>
Je suis corrigé puisque tout ce que vous semblez se soucier est d'où il y a une Ouvert ou fermeture des parenthèses, vous pouvez simplement faire quelque chose comme ceci: p> en anglais: n'importe quel nombre de caractères avec eith an (ou) suivi de n'importe quel nombre de caractères. Cela les correspondra dans n'importe quel ordre cependant, donc si vous avez besoin (à être avant fermé, même si vous ne semblez pas se soucier si les deux sont présents, cela ne fonctionnera pas. P> P>
Je pense que vous pouvez utiliser l'expression régulière suivante.
(?<=^\(?) match the beginning of the line optionally followed by '('
[^()\r\n]+ match 1+ chars other than those indicated
(?=\)?$) match the end of the line optionally preceded by ')'
| or
(?<=\() match '(' in a positive lookbehind
[^()\r\n]+ match 1+ chars other than those indicated
(?=\)) match ')' in a positive lookahead
À la date de la question (14 mai 2020), le Le mécanisme de test de Regexr's ne fonctionnait pas comme prévu (il correspond à < Code> (avec plusieurs) code> mais pas (dans une ligne) code>) semble être un bug dans le mécanisme de test. Si vous copiez et collez les 8 éléments du mode "Texte" de Regexr et testez votre expression, vous le verrez qu'il correspond à "code> (dans la ligne) code>. L'expression fonctionne également comme prévu dans REGEX101 . P>
/ [^ ()] *) | \ ([^ ()] * \ \ ([^ ()] * $ / g code>, évidemment bizarre si l'entrée contient des crochets imbriqués.Lorsque vous dites "fonctionne presque", vous voulez dire que cela ne passe pas le dernier test? (Il ne correspond que
(avec plusieurs) code> mais pas(dans une ligne) code>) semble être un bogue dans le mécanisme de test. Si vous copiez et collez vos 8 éléments dans le mode "Texte" de Regexr et testez votre expression, vous le verrez qu'il correspond à(dans une ligne) code>. Également testé dans regex101.comMerci @henriaugusto tu as totalement raison. Pouvez-vous le poster comme une réponse afin que je puisse fermer cette question?
@Seanlenny Ok, bien sûr!