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

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

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

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

你可以通过在它后面添加?来使单个字母成为可选的:

([A-Z]{1}?)

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

使用

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

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

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

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

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

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

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

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

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