我有以下代码来匹配格式为 1ab11ab111
的字符串其中 1 =任意数字 0到9
和 a 或 b =任何字符 a到z或A到Z
var str = "1ab11ab111";
var patt1 = /[0-9]+[a-z]+[a-z]+[0-9]+[0-9]+[a-z]+[a-z]+[0-9]+[0-9]+[0-9]/i;
那么相同的字符串匹配是否有更简单的方法/代码?
答案 0 :(得分:3)
好[0-9]
可以简化为\d
。如果这些字符类中的每一个都只与一个字符(而不是现在的一个或多个字符)匹配,那么您可以将类似的字符类与单个{…}
量词一起使用,如下所示:
var patt1 = /\d[a-z]{2}\d{2}[a-z]{2}\d{3}/;
这将匹配并且字符串由一个数字组成,后跟两个小写拉丁字母,后跟两个数字,后跟两个小写拉丁字母,后跟三个数字。
但是通过将某些元素组合在一起可以进一步简化它,例如:
var patt1 = /(\d[a-z]\d){2}\d{2}/;
这将匹配所有单个数字,后跟两个小写拉丁字母,后跟一个数字,捕获到组1中,必须出现两次,然后是两位数。
另请注意,这两个字符都匹配字符串中任何匹配此模式的字符序列 - 例如。 'foo1ab11ab111bar'
将是有效的匹配。如果这是一个问题,请使用start(^
)和end($
)锚来防止在匹配的子字符串之前或之后出现任何字符,如下所示:
var patt1 = /^(\d[a-z]\d){2}\d{2}$/;
答案 1 :(得分:2)
您提供的此正则表达式将匹配包含小写字母和数字的任何字符串。
我认为你真的想要:
/^\d[a-z]{2}\d{2}[a-z]{2}\d{3}$/i
以下是我测试的方式:
/^\d[a-z]{2}\d{2}[a-z]{2}\d{3}$/i.test('1ab11ab111'); // true
/^\d[a-z]{2}\d{2}[a-z]{2}\d{3}$/i.test('1ab11Ab111'); // true
/^\d[a-z]{2}\d{2}[a-z]{2}\d{3}$/i.test('1ab11ab11'); // false
答案 2 :(得分:1)
/[0-9][a-z]+[0-9]+[a-z]+[0-9]+/
应该够了
对于完全匹配,你应该这样做,其中a和b可以是你要求的大写字母:
/[0-9][a-zA-Z]{2}[0-9]{2}[a-zA-Z]{2}[0-9]{3}/
答案 3 :(得分:1)
您可以使用/[0-9][a-z]{2}[0-9]{2}[a-z]{2}[0-9]{3}/i
您可以使用\d
代替[0-9]
。因此,模式将使用\d
/\d[a-z]{2}\d{2}[a-z]{2}\d{3}/i
进行测试