通过忽略括号来匹配模式

时间:2020-05-05 21:07:37

标签: php regex

我有一个字符串,我想知道模式的第一个位置。但是,只有在没有用方括号括起来的情况下,才应该找到它。

示例字符串:“ This is a (first) test with the first hit

我想知道第二个first => 32的位置。要与之匹配,(first)必须忽略,因为它放在方括号中。

我尝试过:

preg_match(
  '/^(.*?)(first)/',
  "This is a (first) test with the first hit",
  $matches
);
$result = strlen( $matches[2] );

工作正常,但结果是第一个比赛的位置(11)。

所以我需要更改.*?

我试图用.(?:\(.*?\))*?替换它,希望括号内的所有字符都将被忽略。

但这根本不匹配。

4 个答案:

答案 0 :(得分:2)

/(?<!\()first(?!\))/

您可以使用否定的前瞻吗?和否定的背后看运营商?

preg_match(
  '/(?<!\()first(?!\))/',
  "This is a (first) test with the first hit",
  $matches
);

这仅匹配未括在方括号中的文本,或者如果不需要任何以方括号开头的单词,则可以仅检查单词的开头

/(?<!\()first/

答案 1 :(得分:0)

您可以使用正则表达式

(?!\(first\)).\K\bfirst\b

Demo

正则表达式引擎执行以下操作。

(?!          # begin a negative lookahead
  \(first\)  # match '(first)'
)            # end negative lookahead
.            # match any character
\K           # forget all matched so far (the previous character)
\bfirst\b    # match 'first' surrounded by word breaks

如果该字符串不包含子字符串(first),则每个子字符串first(由分词符包围)都将匹配。根据要求,可能只关注第一个匹配项。

答案 2 :(得分:0)

尝试\(first\)(*SKIP)(*FAIL)|first

demo

答案 3 :(得分:0)

这可能有效

/(?<!\()\bfirst\b(?!\))/g

(第一)被忽略,但{first}或[first]将被匹配(仅第一个单词)。 xxfirstxx也由于边界 \ b

而被忽略

Another sample