我有一个正则表达式,我认为是正确的工作,直到现在。我需要匹配一个可选的字符。它可能在那里,也可能不在。

这里有两个字符串。上面的字符串匹配,下面的字符串不匹配。在较低的字符串中缺少一个字母是导致它失败的原因。

我想在开始的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})/

当前回答

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

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

或者让整个部分都是可选的

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

其他回答

你可以通过添加一个?After it as:

([A-Z]{1}?)

量词{1}是多余的,所以可以去掉它。

Use

[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个独立的捕捉组吗?如果是的话,为什么不捕捉第四组到最后一组数字呢?

下面是密码的正则表达式,它将要求至少8个字符,包括一个数字和小写字母和大写字母,以及可选的特殊字符

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

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

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

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

或者让整个部分都是可选的

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

您也可以使用为您的情况设计的更简单的正则表达式,如(.*)\/(([^\?\n\r])*),其中$2与您想要的匹配。