正则表达式也强制执行长度检查

时间:2014-01-09 07:20:30

标签: regex

我有以下(不工作)正则表达式

(^$|(([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})$))'

所以此时它不起作用。

进行长度检查的正确方法是什么?

是否存在导致问题的语法?

3 个答案:

答案 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()(以您正在使用的语言中存在的任何格式)并保持正则表达式简单;在这一点上,你只是为自己试图在正则表达式中做所有事情而倍增问题。