有一个这样的字符串:'XXX-XXX-XXX';
这可以由用户更改。
比我有这样的另一个字符串,它使用此字符串中的字符来生成序列号:'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
这可以由用户更改。
现在,我需要遍历一堆输入值以确定它们是否与公式匹配(将始终只是X' s和破折号。注意:破折号可能甚至不存在于公式中,这是用户定义的可以从一个不同的输入字段中完全改变。)
基本上,还有另一组输入字段:
<div class="check_these">
<input type="text" class="p-serials" name="pserials[]" value="YER-CGH-JOP" />
<input type="text" class="p-serials" name="pserials[]" value="BAB-CC1-D80" />
<input type="text" class="p-serials" name="pserials[]" value="JUQ-P" />
<input type="text" class="p-serials" name="pserials[]" value="XXX-XXX-XXX" />
</div>
因此,我们有var formula = 'XXX-XXX-XXX';
变量以及字符串var chrs = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
中允许的可能字符
那么,如何更改下面的代码,使其仅返回匹配的代码:
var currMatches = $(".p-serials").map(function () {
// Need to match only formula numbers in here!
return $(this).val();
}).get();
所以,根据上面的输入,
currMatches应该等于:["YER-CGH-JOP", "XXX-XXX-XXX"]
因为这些是唯一符合公式和字符的人。
答案 0 :(得分:2)
这有点不雅观,但您可以使用允许字符串和提供的模式字符串来使用X
的字符串替换来构建正则表达式。从那里你可以循环输入和test
表达式的值。像这样:
var chrs = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; // assume this is retrieved from a user input
var format = 'XXX-XXX-XXX'; // assume this is retrieved from a user input
var re = new RegExp('^' + format.replace(/X/g, "[" + chrs + "]") + '$');
var currMatches = $(".p-serials").map(function () {
if (re.test(this.value))
return this.value;
return;
}).get();
如果要使Regex不区分大小写,可以将标志添加到构造函数中:
new RegExp('^' + format.replace(/X/g, "[" + chrs + "]") + '$', 'i')
另请注意,您需要对此进行大量字符串清理,以确保用户输入不会干扰已识别的Regex运算符。