我正在使用PHP的正则表达式preg_match()来尝试匹配偶尔在中间包含连字符的字符串。字母数字模式是一致的:3个字母后跟3个数字和1个(可选)最后一个字母示例:
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);
如您所见,我可以更详细地介绍前三个字母 - [a-z] {3} - 但可选的短划线语法是我不确定的 - [ - ]?
有什么建议吗?
答案 0 :(得分:2)
匹配的简单模式是
"\b[a-z]{3}-?[0-9]{3}[a-z]?\b"
在这种情况下,您不需要使用括号来匹配单个字符,例如-
,只需使用a?
,b*
,c{3}
或您想要匹配的任何内容
答案 1 :(得分:0)
你需要下一个preg_match:
preg_match_all('/\b[a-z]{3}-?\d{3}[a-z]?\b/i', $subject, $matches);
答案 2 :(得分:0)
由于您可能希望保存字符串而不使用任何短划线,因此您可以分两组进行:
preg_match_all('/\b(\w{3})-?(\d{3}\w?)\b/i', $subject, $matches);
并调用两个子组来创建没有任何破折号的字符串:
$ubject2 = $matches[1].$matches[2];
答案 3 :(得分:0)
字母数字模式是一致的:3个字母后跟3个数字和1个(可选)最后一个字母
/[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];
}