您好我的正则表达式模式有问题:
preg_match_all('/!!\d{3}/', '!!333!!333 !!333 test', $result);
我希望这匹配!! 333但不是!333!333。如何修改此正则表达式以仅匹配最多5个字符 - 两个!和三个数字。
答案 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
)
也就是说,除了最后两个太长了之外。