我有一个我认为到目前为止工作正常的正则表达式。我需要匹配一个可选字符。它可能存在,也可能不存在。
这里有两个字符串。上面的字符串匹配,而下面的不匹配。较低的字符串中缺少一个字母是导致它失败的原因。
如果它存在,我想在开始的 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})/
利用
[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}?)
量词 {1}
是多余的,因此您可以删除它。
您还必须将单个字母标记为可选:
([A-Z]{1})? +.*? +
或使整个部分可选
(([A-Z]{1}) +.*? +)?
您还可以使用为您的情况设计的更简单的正则表达式,例如 (.*)\/(([^\?\n\r])*)
其中 $2
匹配您想要的。
这是密码的正则表达式,至少需要 8 个字符,包括数字和大小写字母以及可选的特殊字符
/((?=.\d)(?=.[az])(?=.*[AZ])(?![~@#$%^&*_-+=`|{}:;!. ?"()[]]).{8,25})/
/((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?![~@#\$%\^&\*_\-\+=`|{}:;!\.\?\"()\[\]]).{8,25})/