我有一个字符串,我想知道模式的第一个位置。但是,只有在没有用方括号括起来的情况下,才应该找到它。
示例字符串:“ 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)。
所以我需要更改.*?
。
我试图用.(?:\(.*?\))*?
替换它,希望括号内的所有字符都将被忽略。
但这根本不匹配。
答案 0 :(得分:2)
/(?<!\()first(?!\))/
您可以使用否定的前瞻吗?和否定的背后看运营商?
preg_match(
'/(?<!\()first(?!\))/',
"This is a (first) test with the first hit",
$matches
);
这仅匹配未括在方括号中的文本,或者如果不需要任何以方括号开头的单词,则可以仅检查单词的开头
/(?<!\()first/
答案 1 :(得分:0)
您可以使用正则表达式
(?!\(first\)).\K\bfirst\b
正则表达式引擎执行以下操作。
(?! # 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
答案 3 :(得分:0)
这可能有效
/(?<!\()\bfirst\b(?!\))/g
(第一)被忽略,但{first}或[first]将被匹配(仅第一个单词)。 xxfirstxx也由于边界 \ b
而被忽略