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


147

我有一个正则表达式,我以为到目前为止可以正常工作。我需要匹配一个可选字符。它可能在那里或可能不在那里。

这是两个字符串。顶部的字符串匹配,而下部的字符串不匹配。低位字符串中没有单个字母是导致失败的原因。

我希望在开头的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})/

Answers:


246

[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个单独的捕获组吗?如果是这样,为什么不捕获倒数第四组数字呢?


蒂姆,老实说我不确定,因为我没有写这个正则表达式。我对regex还是很陌生。如果您发现更好的编写方式,欢迎提出建议。
吉姆

1
蒂姆,无论我在那个位置有没有字母,您的示例都适用于两个字符串。谢谢。
吉姆·

26

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

([A-Z]{1}?)

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


谢谢codeaddict。问号可以代替`+。*吗?+`?
吉姆·

使用grep regex时,如果删除{1},则会收到错误消息(grep:后置断言不是固定长度)。因此,可以将其保留
。– Zunderscore

6

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

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

或将整个部分设为可选

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

1
斯特凡,我想使这封信完全是可选的。我尝试了这两种方法,但仍然没有任何效果。我确定我做错了。您可以修改示例以将其包含在字符串中吗?
吉姆

0

您还可以使用为您的案例设计的更简单的正则表达式,例如(.*)\/(([^\?\n\r])*)在哪里$2匹配所需的东西。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.