Regex И поиск внутри блока, который заключен в какой-то разделитель - PullRequest
2 голосов
/ 25 апреля 2019

Я хочу регулярное выражение И поиск (?=)(?=) внутри блока, заключенного в какой-либо разделитель, такой как #

В следующем примере регулярного выражения, что я ожидал, это то, что cat до ugly соответствует шаблону внутри # cat B до # cat C.
Но регулярное выражение ничем не соответствует.

регулярное выражение

^#(?=[\s\S]*(cat))(?=[\s\S]*(ugly))^#

текст


# cat A

the cat is
very cute.

# cat B

the cat is
very ugly.

# cat C

the cat is
very good.

#

Вы можете проверить регулярное выражение на https://regexr.com/

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

В вашем паттерне ^#(?=[\s\S]*(cat))(?=[\s\S]*(ugly))^# вы используете совпадение # с начала строки ^#, затем 2 положительных прогноза и затем снова совпадение ^#.Вот почему вы не получаете совпадение.

Чтобы получить более точное совпадение, вы можете начать шаблон с ^# cat B

Если вы хотите использовать lookaheads, вы можете использовать 2захват групп в позитивном взгляде.Если вы хотите искать кошку и уродливые слова целиком, вы можете использовать границы слов \b.

(?s) - это модификатор, который разрешает точку, совпадающую с новой строкой, для которой вы также можете использовать /sвместо этого в качестве флага.

(?s)(?=^# cat B.*?(cat).*?(ugly).*?^# cat C

Regex demo

Но может быть проще не использовать упущение и сопоставлять вместо:

(?s)^# cat B.*?(cat).*?(ugly).*?^# cat C$

Php демо

0 голосов
/ 25 апреля 2019

Этот RegEx может помочь вам разработать / сопоставить ваши целевые слова, связав их, используя \ n .

((.+)(cat)(.+))\n((.+)(ugly)(.+))

Проще говоря, для каждого целевого ключевого слова создаются четыре группы: ? и некрасиво , где целевые ключевые слова можно вызывать с помощью .$ 3 и $ 7 :

enter image description here

Вы можете дополнительно связать его с началом ^ и концом $ , если хотите.

Это выражение работает только тогда, когда целевые ключевые слова находятся в середине обеих строк.

...