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

jim*_*jim 120 regex string operators

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

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

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

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

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524
Run Code Online (Sandbox Code Playgroud)

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

/^([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})/
Run Code Online (Sandbox Code Playgroud)

Tim*_*ker 213

使用

[A-Z]?
Run Code Online (Sandbox Code Playgroud)

使这封信可选.{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})
Run Code Online (Sandbox Code Playgroud)

而且,因为在大多数正则表达式方言中,\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})
Run Code Online (Sandbox Code Playgroud)

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

  • 蒂姆,无论我在那个位置是否有字母,您的示例都适用于两个字符串。谢谢。 (2认同)

cod*_*ict 22

您可以通过在?其后添加a来使单个字母可选:

([A-Z]{1}?)
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*fan 6

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

([A-Z]{1})? +.*? +
Run Code Online (Sandbox Code Playgroud)

或使整个部分可选

(([A-Z]{1}) +.*? +)?
Run Code Online (Sandbox Code Playgroud)