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

Php 正则表达式noob需要一个模式来匹配特定的字符串模式,php,regex,Php,Regex,嗨,我正在尝试匹配一个搜索字符串,这样,如果有我们zipcode在字符串的开头,那么返回zipcode的匹配项以及字符串的其余部分。这就是我目前所拥有的 $str = "90210 Beverly Hills, CA"; $res = preg_match('/^((\d{5})(-\d{4})?)\s+(.+?)$/', $str, $matches); 但当我打印匹配项时,它会返回一个额外的空格键 Array ( [0] => 90210 Beverly Hills, CA

嗨,我正在尝试匹配一个搜索字符串,这样,如果有我们zipcode在字符串的开头,那么返回zipcode的匹配项以及字符串的其余部分。这就是我目前所拥有的

$str = "90210 Beverly Hills, CA";
$res = preg_match('/^((\d{5})(-\d{4})?)\s+(.+?)$/', $str, $matches);
但当我打印匹配项时,它会返回一个额外的空格键

Array
(
    [0] => 90210 Beverly Hills, CA
    [1] => 90210
    [2] => 90210
    [3] =>
    [4] => Beverly Hills, CA
)
我是否可以改进模式并返回不是空字符串的匹配项?这个例子有更好的模式吗?此外,如果只给出一个zipcode或一个文本字符串,它将返回false

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

您的比赛组3不是一个空格。它是空的,或者可能是未定义的,或者是其他什么——我对PHP没有太多的兴趣。空值表示与可选组-\d{4}US ZIP+4不匹配。我想你会希望保持你的表达式不变,这样你就可以很容易地检测到没有ZIP+4的情况。

答案是否定的。目视检查你的模式括号表明第四个匹配是-1234四个额外的ZIP数字-不知道它们的正式名称,在你的示例中,这是空的。从你的问题来看,有点不清楚你到底想要捕捉什么。我将留下一个你可能会发现有用的结构:

(?: ...)

如果有?:在paren之后,表示不应进行捕获。您可以将其添加到短划线四位数子模式之前,它将不会添加到匹配项中。

我正在查找一个模式,因此,如果字符串开头有zipcode,后跟文本,则返回zipcode和文本作为匹配项。如果它不符合这些条件,例如仅90210或加利福尼亚州贝弗利山庄或加利福尼亚州贝弗利山庄90210,它将不返回匹配。。原始表达式看起来不错,只需使用匹配项[0],这是整个匹配项。如果您不想捕获子模式,请使用?:,但这没有什么区别,因为第0个匹配应该始终是您想要的?:将更快,但很少,除非您正在检查数百万个邮政编码行,否则您不会注意到