正则表达式PHP字边界?

时间:2014-12-11 00:23:15

标签: php regex

为什么不是这个正则表达式:

$match = preg_grep("%^\w{2,5}\b[a-zA-Z]%", $randarray);

返回'123主要街道'?来自$ randarray = array('123 Main Street');

这些单词边界让我感到困惑。当我输入%^\w{2,5}\b[a-zA-Z]\b%时,也没有任何反应......为什么?

3 个答案:

答案 0 :(得分:2)

字边界不是字符

单词边界为\b。单词边界不是空格或任何字符。它是单词和非单词之间的过渡,所以它实际上是字符之间的点,而不是字符本身。

如果你想匹配123 Main street,你必须匹配一系列数字,然后是一个空格,然后是(我认为)一个或多个单词。像

这样的东西
/^\w{2,5}(\s[a-zA-Z]+\b)+/

因此,第二组匹配一个空格(位于街道编号或名称的前一个单词之后),一系列字母字符和一个单词边界。它将匹配'123主要街道',并且只是'主要街道'。

<强>贪婪/ ungreedy

默认情况下,正则表达式是贪婪的,并且将匹配尽可能多的字符。因此,在这种情况下,您根本不需要单词边界。如果匹配str,则不会与street匹配。因此,以下正则表达式将具有与上面相同的效果(除非您添加一些ungready修饰符)。

/^\w{2,5}(\s[a-zA-Z]+)+/

但对于一个不合理的正则表达式来说,这很重要。比较

^\w{2,5}(\s[a-zA-Z]+?)+

^\w{2,5}(\s[a-zA-Z]+?\b)+

第一个匹配123 M,而第二个匹配123 Main street

测试你的正则表达式

如果你想测试这个或其他正则表达式,你可以访问http://www.phpliveregex.com/它允许你测试正则表达式,看看它们如何与几个preg_*函数一起使用。

答案 1 :(得分:1)

你的表达:

^\w{2,5}\b[a-zA-Z]

在此之前匹配“123 Main Street”:

123 Main Street
   ^

请注意,单词边界实际上根本不占用空间,因此插入符号位于其后面的字符处。

此时,它会尝试匹配[a-zA-Z]并失败。相反,你应该匹配空格:

^\w{2,5}\s+[a-zA-Z]

由于\w\s之间的转换,字边界自然会发生,所以我已经把它拿出来了。

答案 2 :(得分:-2)

假设您要验证您的主题“以2到5个字符长的单词开头”

preg_match('%^\w{2,5}\b[a-zA-Z]*%', '123 Main Street')

(你错过了*