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

How to check if string matches pattern given?

有一个像这样的字符串:'XXX-XXX-XXX'; 这可以由用户更改。 比我有另一个这样的字符串,它使用此字符串中的字符生成序列号:'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; 这可以由用户更改。

现在,我需要遍历一组输入值以确定它们是否匹配公式(将始终只有 X 和破折号。注意:破折号甚至可能不存在于公式中,这是用户定义的并且可以更改来自完全不同的输入字段)。

基本上还有另外一组输入框:

<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';

那么,如何更改下面的代码,使其 returns 仅匹配那些:

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"]

因为只有这些符合允许的公式和字符。

有点难看,但您可以使用允许字符的字符串和提供的模式字符串来构建正则表达式,使用 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

如果你想让正则表达式不区分大小写,你可以在构造函数中添加标志:

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

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