【发布时间】:2020-05-06 05:08:49
【问题描述】:
我有一个字符串,我想知道一个模式的第一个位置。但只有在没有用括号括起来的情况下才能找到它。
示例字符串:“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)。
所以我需要更改.*?。
我试图用.(?:\(.*?\))*? 替换它,希望括号内的所有字符都将被忽略。但这与括号不匹配。
而且我不能使用否定前瞻'/(?<!\()first(?!\))/',因为我有三种不同的括号类型,它们必须匹配左括号和右括号。
【问题讨论】:
-
你是这个意思吗?
(?:\(first\)|\[first]|{first})(*SKIP)(*FAIL)|\bfirst\bregex101.com/r/IAyxap/1