我意识到这不是“让我成为一个正则表达式”网站,但我老实说试图在我自己解决这个问题一段时间。我对正则表达式很糟糕。
基本上,我正在解析位置搜索的查询,其中可能包括各种变体,如“区域,城市,州,邮编”以及介于两者之间的所有内容(带或不带逗号),缩写状态或拼写等。
我正在努力使用州名缩写。主要是因为它并不总是像“VA”那样在任何一侧都有空格,而是它可能是字符串的结尾。我一直在RegEx tool测试这些,这里有一对我试过的“VA”:
/(VA)(\ s | \ n | \ r)/< - 完全没有工作
/(VA)[^ A-Z0-9] * /< - 结束时允许数字和字母
我想我只需要一些关于如何做到这一点的指导?
[编辑] @Igor Korghov
我有一系列带有海岸线的州缩写:
$stateAbbreviations = Array('AL','AK','CA','CT','DE','FL','GA','HI','LA','ME','NH','NJ','NY','NC','OR','MD','MA','MS','RI','SC','TX','VA','WA');
稍后在我的代码中,我循环遍历这些并尝试在我的$查询中匹配它们,这是用strtoupper()大写的。
$query = "LESNER BRIDGE, VIRGINIA BEACH, VA 23453";
foreach($this->stateAbbreviations as $state)
{
if(preg_match("/( VA)[^A-Z0-9]*/", $query, $match))
{
var_dump($match);
}
}
我意识到更有效的方法是找到隔离的2个字符块,然后与我的数组进行比较,但目前,我只是在进行测试以确保我甚至可以获取缩写。
答案 0 :(得分:5)
在缩写词周围使用单词边界:
/\b(VA)\b/
一般正则表达式:
/\b([A-Z]{2})\b/
将您的代码更改为:
$stateAbbreviations = Array('AL','AK','CA','CT','DE','FL','GA','HI','LA','ME','NH','NJ','NY','NC','OR','MD','MA','MS','RI','SC','TX','VA','WA');
$query = "LESNER BRIDGE, VIRGINIA BEACH, VA 23453";
foreach($this->stateAbbreviations as $state) {
if(preg_match("/\b($state)\b/", $query, $match)) {
var_dump($match);
}
}
答案 1 :(得分:3)
正则表达式中的行尾字符为$
,行尾字符为^
,因此这可能是您要查找的内容:
/(^|[ ,])[A-Z]{2}($|[ ,])/
这将匹配:
答案 2 :(得分:0)
/\s+[A-Z]{2}\s+/
将匹配两个带有明确(一个或多个)空格的大写字母