为什么不是这个正则表达式:
$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%
时,也没有任何反应......为什么?
答案 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')
(你错过了*
)