2

我正在尝试suburb name从以下内容中提取:

12 street name, suburb name, CTG 1234 

在 PHP 中使用正则表达式。

  • 街道和郊区名称都可以是任意数量的单词。
  • CTG 是 state 的首字母缩写词,始终为已知且始终相同。
  • 后跟 4 位邮政编码。

我想出了以下正则表达式,但不能完全理解我想要的。

/[\.|,]+\s*(.*?)[\.|,]+*\s*CTG\d{4,4}$/i

在哪里:

  • CTG\d{4,4}$就是从左边找邮编和州。
  • [\.|,]*\s*是在街道和郊区名称后至少匹配一个点或逗号,后跟零个或多个空格。
  • (.*?)就是要抓住我的目标。郊区名称。
  • *?所以它不会贪婪。

以上在 preg_match() 中使用,任何给定的主题都返回一个匹配数组,其中:

  • arrey[0]=整场比赛
  • arrey[1]=12=街道名称,郊区名称

但是,如果在http://www.regexplanet.com中尝试过,它似乎工作正常。

4

3 回答 3

2

试试这个^(.*)[\.,]\s+(.*)[\.,]\s+CTG\s+(\d+)$提取匹配组号。2 .

于 2013-10-12T12:59:22.257 回答
2

您可以通过以下方式获取郊区名称:

$str = '12 street name, suburb name, CTG 1234';
$pattern = '/[^.,]++(?=[.,]\s*CTG \d{4}$)/';

preg_match($pattern, $str, $result);

echo $result[0];

为了只匹配郊区名称,我使用了前瞻断言(?=...),它只执行检查而不记录匹配。

图案细节:

/
[^.,]++            # all that is not a . or a , one or more times (possessive)
(?=                # open lookahead assertion (means "followed by")
    [.,]\s*        # a . or a , with optional white characters
    CTG \d{4}$     # CTG, a space, four digits, end of string
)                  # close the lookahead
/                          
于 2013-10-12T13:10:29.017 回答
1

看起来您错过了 CTG 和数字之间的空格(也不需要在括号内转义句点,也不需要 OR 管道)。这应该满足您的需求:

/.*[.,]+\s*(.*)[.,]+\s*CTG\s*\d{4,4}$/i

您可以在PHP Live Regex上通过示例文本看到上述模式

于 2013-10-12T13:07:45.553 回答