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*
.