1
votes

Faire correspondre plusieurs lettres et caractères spéciaux dans regex

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?


1 commentaires

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


3 Réponses :


1
votes

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·+#_]*)


1 commentaires

Merci beaucoup surtout pour l'explication. Ça a marché!



1
votes

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


0 commentaires

2
votes

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'


0 commentaires