J'essaie d'attraper des chaînes autour de l'acronyme ADJ. Les chaînes ressemblent à ceci:
·NOM·JJ·ADJ+CASE_DEF_GEN ·NOM·JJ·ADJ+CASE_DEF_ACC ·NOM·JJ·ADJ+CASE_INDEF_GEN ·NOM·DT+JJ·DET+ADJ+NSUFF_FEM_SG+CASE_DEF_GEN ·NOM·JJ·ADJ+CASE_INDEF_GEN ·NOM·JJ·ADJ+NSUFF_FEM_SG+CASE_INDEF_GEN ·NOM·DT+JJ·DET+ADJ+NSUFF_FEM_SG+CASE_DEF_ACC
Jusqu'à présent, j'ai ceci:
/[A-Z·\+#_ *?[·\+ ADJ[·\+[A-Z_·\+# *?/g
Mais cela ne correspond qu'à partir du début des chaînes jusqu'à "ADJ +" Â · NOMÂ · DT + JJÂ · DET + ADJ + .
Puisque le reste des chaînes après ADJ ont la même composition que le début des chaînes avant ADJ, j'ai pensé que / [A-ZÂ · \ + # _] *? [Â · \ +] / g devrait fonctionner, mais ce n'est pas le cas.
Comment faire correspondre le reste de la chaîne?
3 Réponses :
Je suppose que vous voulez vous assurer que vous avez un ADJ dans la chaîne, et si tel est le cas, nous pourrions peut-être simplifier notre expression en quelque chose de similaire à:
([A-Z·+#_]*)\bADJ\b([A-Z·+#_]*)
Merci beaucoup surtout pour l'explication. Ça a marché!
La suppression du ? à la fin correspondrait à toutes les chaînes,
/[A-Z·\+#_]*?[·\+]ADJ[·\+][A-Z_·\+#]*/g
Je ne suis pas tout à fait sûr de savoir pourquoi vous aviez besoin d'un ? dans un * .
Ce quantificateur *? après la phrase + ADJ + est satisfait de la chaîne vide juste après, puisque le ? fait le quantificateur avant il correspond " le nombre minimum de fois possible " et pour * soit zéro fois.
Alors laissez tomber le ? , qui n'a pas non plus d'utilité pour le reste de la ligne
perl -wE'$_=q(-XADJX-JJ+ADJ-REST-);
($before, $after) = /(.*?)[+\-]ADJ[+\-](.*)/;
say for $before,$after'
Habituellement (tout le temps), si vous avez un
*?à la dernière partie de votre regex, le moteur effectue un vidage et quitte la correspondance. Dans votre cas, vous n'avez besoin de rien d'autre qu'un*.