Совпадение нескольких букв и специальных символов в регулярном выражении - PullRequest
1 голос
/ 12 июля 2019

Я пытаюсь поймать строки вокруг аббревиатуры ADJ.Строки выглядят так:

·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

Пока что у меня есть это: /[A-Z·\+#_]*?[·\+]ADJ[·\+][A-Z_·\+#]*?/g

Но оно совпадает только с начала строк до "ADJ +" ·NOM·DT+JJ·DET+ADJ+.

Поскольку остальные строки после ADJ имеют одинаковый состав начала строк до ADJ, я подумал, что /[A-Z·\+#_]*?[·\+]/g должно работать, но это не так.Как мне сделать так, чтобы он соответствовал остальной части строки?

Ответы [ 3 ]

2 голосов
/ 12 июля 2019

Этот *? квантификатор после фразы +ADJ+ удовлетворяется пустой строкой сразу после нее, поскольку ? делает квантификатор до того, как он совпадет " минимально возможное число раз" и для * это ноль раз.

Так что опустите ?, который также не имеет смысла для остальной части строки

perl -wE'$_=q(-XADJX-JJ+ADJ-REST-); 
    ($before, $after) = /(.*?)[+\-]ADJ[+\-](.*)/; 
    say for $before,$after'
1 голос
/ 12 июля 2019

Удаление ? в конце будет соответствовать целым строкам,

/[A-Z·\+#_]*?[·\+]ADJ[·\+][A-Z_·\+#]*/g

Я не совсем уверен, зачем вам нужна ? в *.

1 голос
/ 12 июля 2019

Я предполагаю, что вы хотите убедиться, что у вас есть ADJ в строке, что, если так, возможно, мы могли бы упростить наше выражение до чего-то похожего на:

([A-Z·+#_]*)\bADJ\b([A-Z·+#_]*)

Выражение объяснено на верхней правой панели этой демонстрации , если вы хотите изучить / упростить / изменить его, а в этой ссылке вы можете посмотреть, как оно будет если хотите, сравнивайте с некоторыми примерами входных данных шаг за шагом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...