我需要从有效的电子邮件主题中提取子字符串。有效的子字符串如下:
ab-2011-0023ad
或ac-2011-0023ad.r1
,只允许使用两个短划线,第二个短划线后的字母数会有所不同,但只有一个点或不带点的字母数字。
我写了这个,但是如果我在第二个破折号之后放一个非法字符,则regexp返回部分子字符串不为空
/([a-z0-9]{0,3}[-]\d{4}[-][a-z0-9.]+)\S/i
即:"this is an email with ab-2011-0023:ad document"
,我希望regexp返回空数组而不是[0] => ab-2011-0023
。
答案 0 :(得分:1)
您的reg exp不正确。 1.永远不要在像[ - ]这样的符号类中使用一个文字。你应该逃避它 - 但是点头添加到符号类。 2. [a-z0-9。] +此作品与字符串“..............”匹配。所以,这不正确。 3.最后,您使用分隔符\ S(匹配除空格之外的所有内容)。
我的建议是使用这样的smth(如果你的reg exp引擎支持Negative Lookbehind)
/[a-z\d]{0,3}\-\d{4}\-(?:[a-z\d]+|(?<!\.)\.)+\s/i
答案 1 :(得分:0)
尝试转义(.
匹配任何字符),并强制匹配完整字符串($
启动结束,^
表示开头):
/^[a-z0-9]{0,3}[\-]\d{4}[\-][a-z0-9\.]+$/i
示例:
$subject = "ac-2011-0023ad.r1";
$subject2 = "ab-2011-0023:ad";
if(preg_match("/^[a-z0-9]{0,3}[\-]\d{4}[\-][a-z0-9\.]+$/i",$subject,$match)) {
echo "Found : ".$match[0]."\n";
}
if(preg_match("/^[a-z0-9]{0,3}[\-]\d{4}[\-][a-z0-9\.]+$/i",$subject2,$match)) {
echo "Found : ".$match[0]."\n";
}
答案 2 :(得分:0)
只需在正则表达式周围添加空格:
/(?:\s|)([a-z0-9]{0,3}[-]\d{4}[-][a-z0-9]+(?:\.[a-z0-9]+)?)(?:\s|)/i