首页 文章

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

提问于
浏览
86

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

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

我在那里,如果没有,继续得到其余的字符串 . 这封信可以是 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})/

3 回答

  • 155

    使用

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

  • 14

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

    ([A-Z]{1}?)
    

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

  • 5

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

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

    或使整个部分可选

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

相关问题