假设我们有正则表达式,在我的情况下,我发现它与英国汽车登记牌相匹配:
^([A-Z]{3}\s?(\d{3}|\d{2}|d{1})\s?[A-Z])|([A-Z]\s?(\d{3}|\d{2}|\d{1})\s?[A-Z]{3})|(([A-HK-PRSVWY][A-HJ-PR-Y])\s?([0][2-9]|[1-9][0-9])\s?[A-HJ-PR-Z]{3})
典型的英国汽车注册
HG53CAY
这与正则表达式正确匹配,但我想要做的是找到一种匹配任何前缀子字符串的方法,因此以下内容都是有效的:
H, HG, HG5, HG53, HG53C, HG53CA, HG53CAY
是否有建议的方法来实现这一目标?
答案 0 :(得分:1)
首先,我会将你的正则表达式重写为:
^([A-Z]{3}\s?(\d{1,3})\s?[A-Z])|([A-Z]\s?(\d{1,3})\s?[A-Z]{3})|(([A-HK-PRSVWY][A-HJ-PR-Y])\s?([0][2-9]|[1-9][0-9])\s?[A-HJ-PR-Z]{3})
因为\d{3}|\d{2}|d{1}
部分没有意义,应该写成\d{1,3}
。
重写正则表达式
^([A-Z]{0,3}\s?(\d{0,3})\s?[A-Z]?)|([A-Z]\s?(\d{0,3})\s?[A-Z]{0,3})|(([A-HK-PRSVWY][A-HJ-PR-Y]?)\s?([0]?[2-9]?|[1-9]?[0-9]?)\s?[A-HJ-PR-Z]{0,3})
应该具有允许仅匹配注册开头的期望效果,但不幸的是,不再保证完整注册将是有效注册,因为我必须使大多数字符可选。
你可能会尝试这样的事情
^(([A-Z]{3})|[A-Z]{1,2}$)\s?((\d{1,3})|$))...
要求它要么每个部分都完整,要么它不完整,但后面跟着“字符串结束”,由正则表达式中的$
表示。