PCRE, соответствующие подшаблонам ловли

#pcre

Вопрос:

Мне стыдно, что я не могу этого понять, поэтому я должен спросить. Но допустим, у меня есть строка, в которой я хочу сопоставить одно или два слова. Первое слово всегда должно совпадать, а второе слово иногда присутствует, а иногда отсутствует, поэтому его следует сопоставлять, если оно присутствует. Если он отсутствует, первое слово все равно должно быть сопоставлено. Т. е. все выражение не должно проваливаться, если отсутствует второе слово.

  "this <word> must always be matched and this <word1> will maybe be matched"
 

Наивно я попытался

 (word).*(word1)?
 

но даже если присутствуют оба слова, <word> возвращается только одно. Если я удалю»?», будут возвращены оба слова, но если <word1> их нет, будет возвращено «нет совпадения».

 ~/ % pcretest
PCRE version 8.45 2021-06-15

  re> "(word).*(word1)"
data> this is <word> and this is <word1>"
 0: word> and this is <word1
 1: word
 2: word1

  re> "(word).*(word1)?"
data> this is <word> and this is <word1>"
 0: word> and this is <word1>"
 1: word

  re> "(word).*(word1)"
data> this is <word> and this is"
No match
 

Комментарии:

1. Кажется, это работает идеально. Спасибо, Виктор!

Ответ №1:

Вы можете использовать

 (word)(?:.*(word1))?
 

Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • (word) — a word захвачен в группу 1
  • (?:.*(word1))? — необязательная группа без захвата, соответствующая одному или нулю вхождений
    • .* — любые нулевые или более символов, кроме символов разрыва строки, как можно больше
    • (word1) word1 захвачен в группу 2.