正则表达式 PHP 单词边界


Regex PHP word boundaries?

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

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

返回"123 主街"? 从 $randarray = 数组('123 主街'(;

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

单词边界不是字符

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

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

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

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

贪婪/不贪婪

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

/^'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_*函数一起使用。

你的表达:

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

将匹配"123 Main Street"直到这里:

123 Main Street
   ^

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

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

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

由于'w's之间的过渡,边界这个词自然会出现,所以我把它去掉了。

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

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

(你错过了*(