正则表达式菜鸟需要一个模式来匹配特定的字符串模式


Regex noob needing a pattern to match specific string patterns

嗨,我正在尝试匹配一个搜索字符串,以便如果字符串的开头有我们的邮政编码,则返回邮政编码的匹配项以及字符串的其余部分。这就是我到目前为止所拥有的

$str = "90210 Beverly Hills, CA";
$res = preg_match('/^(('d{5})(-'d{4})?)'s+(.+?)$/', $str, $matches);

但是当我print_r匹配项时,它会返回一个额外的空间键。

Array
(
    [0] => 90210 Beverly Hills, CA
    [1] => 90210
    [2] => 90210
    [3] =>
    [4] => Beverly Hills, CA
)

无论如何,我可以改进模式并返回不是空字符串的匹配项吗?对于这种情况,有更好的模式吗?此外,如果只给出邮政编码或仅给出文本字符串,它将返回 false。

答案是否定的。 目视检查模式括号表明,第四个匹配项将是 -1234(四个额外的压缩数字 - 不知道它们的正式名称),在您的示例中,它是空的。 从您的问题中不清楚您实际要捕获的内容。 我将留下一个您可能会发现有用的结构:

(?: ...)

如果在括号后有?:,则表示不应进行捕获。 您可以在"破折号四位数"子模式之前添加它,它不会添加到 matches 中。

^(('d{5})?(.*+))$

http://rubular.com/r/bZJe4p1k9O

您的匹配组 3 不是空格。它是空的(或者可能是未定义的或其他什么 - 我没有深入参与 PHP)。空值表示与可选组(-'d{4}) (US ZIP+4) 不匹配。我想你会希望保持你的表达式不变,以便你可以很容易地检测到不存在 ZIP+4 的情况。