我需要这个正则表达式模式的帮助

时间:2011-06-06 20:34:50

标签: php regex string

您好我的正则表达式模式有问题:

preg_match_all('/!!\d{3}/', '!!333!!333 !!333 test', $result);

我希望这匹配!! 333但不是!333!333。如何修改此正则表达式以仅匹配最多5个字符 - 两个!和三个数字。

3 个答案:

答案 0 :(得分:6)

/^!!\d{3}$/

您需要与字符串开头匹配的锚点^和结尾的$。它就像是说:“必须从字符串的开头开始,必须在它结尾处结束。”如果省略一个(或两个),则模式允许在开头和/或结尾处使用任意符号。

更新

正如我在评论中发现的那样,这个问题非常具有误导性。现在我建议在应用模式之前拆分字符串

$string = '!!333!!333 !!333 test';
$result = array();
foreach (explode(' ', $string) as $index => $item) {
  if (preg_match('/^!!\d{3}$/', $item)) {
    $result[$index] = $item;
  }
}

这也尊重项目的索引。如果您不需要它,请删除$index内容或忽略它;)

比试图找到一个模式更容易,一次完成你的请求。

答案 1 :(得分:2)

^!!\d{3}$

你需要锚定你的模式。

如果你想将一个字符串与!! 333匹配,你可能想要这样的东西:

(^|\s)!!\d{3}($|\s)

进一步说明我们可以进一步改进:

(^|\s)!!\d{3}(?=$|\s)

这不会捕获尾随空格,允许同一行中的多个匹配一个接一个地匹配。

答案 2 :(得分:0)

我发现最简单,最具描述性的方法是使用负面的前瞻和外观。

请参阅:

preg_match_all('/(?<![^\s])!!\d{3}(?![^\s])/', '!!333 !!333!!333 !!333 test !!333', result);

这说:匹配形式的任何东西!! [0-9] [0-9] [0-9]除了前面或后面的空格之外没有任何东西。请注意,这些前瞻/后视本身并不匹配,它们是“零宽度断言”,它们被丢弃,因此您只能在匹配中获得“!! 333”等,而不是“!! 333”等。

返回

[0] => Array
        (
            [0] => !!333
            [1] => !!333
            [2] => !!333
        )

)

另外

preg_match_all(
    '/(?<![^\s])!!\d{3}(?![^\s])/', 
    '!!333 !!555 !!333 !!123 !!555 !!456 !!333 !!333 !!444 !!444 !!123 !!123 !!123!!123',
    $result));

返回

[0] => Array
    (
        [0] => !!333
        [1] => !!555
        [2] => !!333
        [3] => !!123
        [4] => !!555
        [5] => !!456
        [6] => !!333
        [7] => !!333
        [8] => !!444
        [9] => !!444
        [10] => !!123
        [11] => !!123
    )

也就是说,除了最后两个太长了之外。

请参阅Lookahead tutorial