2

我正在使用 PHP 的正则表达式 preg_match() 来尝试匹配中间偶尔包含连字符的字符串。字母数字模式是一致的:3 个字母后跟 3 个数字和一个(可选)最后一个字母 示例:

RTE234
RTE-234  

OR

DGF123R
DGF-123R

我的数据库保存字符串时没有任何破折号,但字符串的数据源现在开始有时包含它。所以我以前一直在工作的模式:

preg_match_all("/\b\(?([a-z0-9-]+)\)?\b/i", $subject, $matches);

需要调整,但我不确定如何形成允许可选连字符的多括号字符串。我的第一次尝试...

preg_match_all("/\b([a-z]{3}[-]?[a-z0-9-]+)\b/i", $subject, $matches);

如您所见,我可以更详细地了解前 3 个字母 - [az]{3} - 但可选的破折号语法是我不确定的 - [-]?

有什么建议么?

4

4 回答 4

2

一个匹配的简单模式是

"\b[a-z]{3}-?[0-9]{3}[a-z]?\b"

在这种情况下,您不需要括号来匹配单个字符-,只需使用a?,或您想要匹配的任何内容。b*c{3}

于 2013-07-12T08:52:54.490 回答
0

你需要下一个 preg_match:

preg_match_all('/\b[a-z]{3}-?\d{3}[a-z]?\b/i', $subject, $matches);
于 2013-07-12T08:51:40.030 回答
0

由于您可能希望保存没有任何破折号的字符串,因此您可以分两组进行:

preg_match_all('/\b(\w{3})-?(\d{3}\w?)\b/i', $subject, $matches);

并调用两个子组来创建没有任何破折号的字符串:

$ubject2 = $matches[1].$matches[2];
于 2013-07-12T09:01:13.940 回答
0

字母数字模式是一致的:3 个字母后跟 3 个数字和一个(可选)最后一个字母

/[a-z]{3}\d{3}[a-z]?/

中间偶尔会包含一个连字符

/([a-z]{3})-?(\d{3}[a-z]?)/

在代码中:

if (preg_match('/([a-z]{3})-?(\d{3}[a-z]?)/', $str, $matches)) {
    echo $matches[1] . $matches[2];
}
于 2013-07-12T09:09:34.883 回答