正则expression式如何匹配一个可选的字符

我有一个正则expression式,我认为到现在为止工作正常。 我需要匹配一个可选的字符。 它可能在那里,也可能不在。

这是两个string。 最上面的string是匹配的,而下面的不匹配。 在较低的string中没有单个字母是什么使它失败。

我想在开始的5位数字之后得到单个字母,如果不存在,继续得到string的其余部分。 这封信可以是AZ

如果我删除([AZ]{1}) +.*? + ([AZ]{1}) +.*? +从正则expression式,它将匹配除了字母之外的所有我需要的东西,但它是重要的。

 20000 K Q511195DREWBT E00078748521 30000 K601220PLOPOH Z00054878524 

这是我正在使用的正则expression式。

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

使用

 [AZ]? 

使字母可选。 {1}是多余的。 (当然你也可以写[AZ]{0,1}这意味着相同的,但是这就是那个)。

你可以改进你的正则expression式

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

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

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

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

您可以通过添加一个? 之后为:

 ([AZ]{1}?) 

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

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

 ([AZ]{1})? +.*? + 

或者使整个部分可选

 (([AZ]{1}) +.*? +)?