PCRE匹配捕获子模式

PCRE matching catching subpatterns

不好意思想不通,只好请教。但是假设我有一个字符串 我想匹配一个或两个单词的地方。第一个词必须始终匹配,第二个词有时存在有时不存在,因此如果存在则应匹配。如果不存在,第一个单词仍必须匹配。 IE。如果第二个词不存在,整个表达式不能失败。

 "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

你可以使用

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

参见regex demo。详情:

  • (word) - word 被捕获到组 1
  • (?:.*(word1))? - 可选的非捕获组匹配一次或零次出现
    • .* - 除换行字符外的任何零个或多个字符尽可能多
    • (word1) - word1 捕获到第 2 组。