正则表达式如何匹配可选字符

时间:2010-10-24 06:34:18

标签: regex string operators

我有一个我认为直到现在才正常工作的正则表达式。我需要匹配一个可选字符。它可能存在或者可能不存在。

这是两个字符串。顶部字符串匹配,而下部字符串不匹配。较低字符串中缺少单个字母是导致其失败的原因。

如果它在那里,我想在起始的5位数之后得到单个字母,如果没有,继续获取字符串的其余部分。这封信可以是A-Z

如果我从正则表达式中移除([A-Z]{1}) +.*? +,它将匹配除了字母之外我需要的所有内容,但这很重要。

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

这是我正在使用的正则表达式。

/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/

5 个答案:

答案 0 :(得分:184)

使用

[A-Z]?

使字母可选。 {1}是多余的。 (当然你也可以写[A-Z]{0,1},这意味着相同,但这就是?的用途。)

您可以将正则表达式提高到

^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})

而且,由于在大多数正则表达式中,\d[0-9]相同:

^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})

但是:你真的需要11个独立的捕获组吗?如果是这样,为什么不捕获倒数第四组的数字呢?

答案 1 :(得分:16)

您可以通过在?之后添加([A-Z]{1}?) 来使单个字母成为可选项:

{1}

量词{{1}}是多余的,因此您可以删除它。

答案 2 :(得分:6)

您必须将单个字母标记为可选:

([A-Z]{1})? +.*? +

或使整个部分可选

(([A-Z]{1}) +.*? +)?

答案 3 :(得分:0)

您还可以使用针对您的情况设计的更简单的正则表达式,例如(.*)\/(([^\?\n\r])*),其中$2符合您的要求。

答案 4 :(得分:0)

这里是密码的正则表达式,至少需要 8 个字符,包括数字、大小写字母和可选的特殊字符

/((?=.\d)(?=.[az])(?=.*[AZ])(?![~@#$%^&*_- +=`|{}:;!.?"()[]]).{8,25})/

/((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?![~@#\$%\^&\*_\-\+=`|{}:;!\.\?\"()\[\]]).{8,25})/