如何检查字符串是否与给定的模式匹配?

时间:2015-11-19 16:01:11

标签: jquery arrays array-map

有一个这样的字符串:'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"]

因为这些是唯一符合公式和字符的人。

1 个答案:

答案 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();

Example fiddle

如果要使Regex不区分大小写,可以将标志添加到构造函数中:

new RegExp('^' + format.replace(/X/g, "[" + chrs + "]") + '$', 'i')

另请注意,您需要对此进行大量字符串清理,以确保用户输入不会干扰已识别的Regex运算符。