我有以下(不工作)正则表达式
(^$|(([a-zA-Z]{4}[a-zA-Z]{2}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?))((^([a-zA-Z0-9]{8})$)|(^([a-zA-Z0-9]{11})$)))
让我打破逻辑。
^$|
是第一部分,这实际上意味着如果字符串为0长度,则验证为true。
然后添加下一位。
([a-zA-Z]{4}[a-zA-Z]{2}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?)
- 这是需要匹配的字符串格式,实际上这与BIC(银行标识符代码)相匹配。
所以我们最终得到:
pattern: '(^$|([a-zA-Z]{4}[a-zA-Z]{2}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?))'
如果提供了一个值,基本上只匹配BIC,到目前为止还不错?
但是现在我想扩展它以确保字符串是8或11个字符。
所以我提出了这个小问题来匹配8个字符:(^([a-zA-Z0-9]{8})$)
因此,如果我们将其捆绑到我们的正则表达式中,我们最终会使用
'(^$|([a-zA-Z]{4}[a-zA-Z]{2}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?)(^([a-zA-Z0-9]{8})$))'
所以此时它不起作用。
进行长度检查的正确方法是什么?
是否存在导致问题的语法?
答案 0 :(得分:3)
I want to extend this to also ensure that the string is either 8 or 11 characters.
首先,你的正则表达式可以缩短为:
([a-zA-Z]{6}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?)
如果你注意到你已经匹配length = 8或length = 11,因为最后3个alpha数字是可选的。我建议用开始/结束锚点将它们括起来以强制执行长度。
您的最终正则表达式可以是:
^(?:[a-zA-Z]{6}[a-zA-Z0-9]{2}([a-zA-Z0-9]{3})?)?$
PS:你真的不需要特定的^$
来匹配,因为我已经使整个正则表达式可选,从而允许它匹配空字符串。
在线工作演示:http://regex101.com/r/lA6jK6
答案 1 :(得分:2)
你可以使用先行断言查找8或11个字符,然后是字符串的结尾。
在PCRE和JS中:
(^$|^(?=.{8}(?:.{3})?$)(...))
答案 2 :(得分:0)
为什么用正则表达式检查字符串长度?想到了Jamie Zawinski的一句话。只需使用string.length()(以您正在使用的语言中存在的任何格式)并保持正则表达式简单;在这一点上,你只是为自己试图在正则表达式中做所有事情而倍增问题。