正则表达式如何匹配可选字符
Posted
技术标签:
【中文标题】正则表达式如何匹配可选字符【英文标题】:Regex how to match an optional character 【发布时间】:2011-04-29 18:27:28 【问题描述】:我有一个正则表达式,我认为它直到现在都可以正常工作。我需要匹配一个可选字符。它可能存在,也可能不存在。
这里有两个字符串。上面的字符串匹配,而下面的不匹配。较低的字符串中缺少一个字母是导致它失败的原因。
我想在开始的 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)/
【问题讨论】:
【参考方案1】:使用
[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]
相同:
^(\d5)+\s+([A-Z]?)\s+([A-Z])(\d3)(\d3)([A-Z]3)([A-Z]3)\s+([A-Z])\d3(\d4)(\d2)(\d2)
但是:您真的需要 11 个单独的捕获组吗?如果是这样,为什么不捕获倒数第四组数字?
【讨论】:
蒂姆,老实说,我不确定,因为我没有写这个正则表达式。我对正则表达式还是很陌生。如果您看到更好的写作方式,我愿意接受建议。 蒂姆,无论我在那个位置是否有字母,您的示例都适用于两个字符串。谢谢。【参考方案2】:您可以通过在其后添加?
来使单个字母可选:
([A-Z]1?)
量词1
是多余的,因此您可以删除它。
【讨论】:
感谢 codeaddict。问号是否代替了`+.*? +`? 当使用 grep 正则表达式时,如果你删除 1 会出现错误(grep:lookbehind assertion is not fixed length)。所以这是一个把它留在里面的情况。【参考方案3】:您也必须将单个字母标记为可选:
([A-Z]1)? +.*? +
或将整个部分设为可选
(([A-Z]1) +.*? +)?
【讨论】:
Stefan,我想让这封信完全是可选的。我尝试了这两种方法,但仍然没有匹配。我确定我弄错了。您能否修改您的示例以将其包含在字符串中?【参考方案4】:您还可以使用为您的情况设计的更简单的正则表达式,例如 (.*)\/(([^\?\n\r])*)
其中 $2
匹配您想要的。
【讨论】:
【参考方案5】:这里是密码的正则表达式,至少需要 8 个字符,包括数字和大小写字母以及可选的特殊字符
/((?=.\d)(?=.[az])(?=.*[AZ])(?![~@#$%^&*_- +=`|:;!.?"()[]]).8,25)/
/((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?![~@#\$%\^&\*_\-\+=`|:;!\.\?\"()\[\]]).8,25)/
【讨论】:
以上是关于正则表达式如何匹配可选字符的主要内容,如果未能解决你的问题,请参考以下文章
正则表达式模块re:正则表达式常用字符常用可选标志位group与groupsmatchsearchsubfindallcompile