PHP中可选字符的正则表达式匹配

时间:2013-07-12 08:46:46

标签: php regex preg-match-all

我正在使用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} - 但可选的短划线语法是我不确定的 - [ - ]?

有什么建议吗?

4 个答案:

答案 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];
}