(正则表达式)如何在此表达式中添加Lookaround(Lookbehind)

时间:2014-02-17 12:16:46

标签: regex

我写了一个正则表达式,但我对如何注入一个环顾问题很困惑。

我有以下字符串:

myName is myLastName
yourName is yourLastName

我希望,使用负面的lookbehind,使它只匹配不包含myName的那个。 myName不一定在句子的开头,它可能只是在另一个较长的短语的中间。到目前为止,我已经写了以下匹配reg exp,它们匹配两个句子(当然),但是我想用负面看后面添加一个条件:

(([a-zA-Z]*)( *)(is)( *)([a-zA-Z]*))

2 个答案:

答案 0 :(得分:1)

如果您想使用负面反对,那么以下正则表达式应该有效:

([a-zA-Z]+)(?<!\bmyName\b) +is +([a-zA-Z]+)

在线演示:http://regex101.com/r/eY8oG3

(?<!\bmyName\b)是一个负面的lookbehind,它与前面带有文字字符串myName的单词不匹配。 \b用于字边界。

答案 1 :(得分:0)

如果您只是想匹配不包含单词myName的字符串,那么您可以使用以下正则表达式,并带有否定的前瞻:

/^(?!myName).*$/

<强>解释

  • / - 开始分隔符
    • ^ - 在字符串开头处断言位置
    • (?! - 负向前瞻
    • myName - 字面匹配字符myName
    • ) - 前瞻
    • .* - 匹配任何字符(换行符除外)零次或多次
    • $ - 在字符串末尾断言位置
  • / - 结束分隔符

基本上,上述正则表达式将匹配任何不包含单词myName的字符串(区分大小写)。

测试案例

$arr =['myName is myLastName','yourName is yourLastName'];

foreach ($arr as $str) {
    if (preg_match('/^(?!myName).*$/', $str, $matches)) {
        echo 'Match', PHP_EOL;
    } else {
        echo 'No match', PHP_EOL;
    }
}

输出:

No match
Match