如何编写正则表达式以匹配1年,但在JavaScript中不匹配1年



我正在尝试编写与一串数字匹配的正则表达式,然后是特定的字母。

有效的字母为: D, W, M, Y, LY, LM
有效数字是:0 to 9

我有以下言论,但我需要以下几点帮助:

  • 我不想匹配1yy,或1ym或其他任何其他内容
  • 我想忽略案例

这是我的代码:

    this.isValid= function(inpt) {
        var re = "[0-9]+[Y|M|W|D|LY|LM]";
        if (inpt.match(re) === null) {
            return false;
        } else {
            return true;
        }
    };

我需要以下结果:

    isValid("1Y")  //  true
    isValid("1y")  //  true  (lowercase is valid)
    isValid("1YY") //  false (YY is not valid)
    isValid("1mm") //  false (mm is not valid)
    isValid("1LY") //  true
    isValid("Y1")  //  false (order is incorrect)
    isValid("1A")  //  false (A is not valid)
    isValid("1YA") //  false (A is not valid)

几件事:

  1. 您拥有的是一个字符串,而不是正则表达式,尽管String.prototype.match会为您通过new RegExp运行。最好用字面符号(/expression/)编写正则表达式。

  2. [Y|M|W|D|LY|LM]是一个角色类,说"匹配y,|,m,d或l"。对于交替,使用组;因为在您的情况下,您不需要捕获结果,所以一个非捕获组:(?:Y|M|W|D|LY|LM)

  3. 进行不敏感的匹配,使用i标志。

  4. 说"匹配此匹配,但不遵循","使用负面的外观:(?!...)。(但是继续阅读,我怀疑您不想这样做。)

因此您可以使用:

var re = /[0-9]+(?:Y|M|W|D|LY|LM)(?![Y|M|W|D|LY|LM])/i;

测试的示例:

this.isValid= function(inpt) {
    var re = /[0-9]+(?:Y|M|W|D|LY|LM)(?![Y|M|W|D|LY|LM])/i;
    if (inpt.match(re) === null) {
        return false;
    } else {
        return true;
    }
};
//I need the following results:
console.log(isValid("1Y")); // true
console.log(isValid("1y")); //true
console.log(isValid("1YY")); //false
console.log(isValid("1mm")); //false
console.log(isValid("1LY")); //true
console.log(isValid("Y1")); //false

,如果要匹配 the string,则不需要负look-head,只需使用锚点(^$):

var re = /^[0-9]+(?:Y|M|W|D|LY|LM)$/i;

测试的示例:

this.isValid= function(inpt) {
    var re = /^[0-9]+(?:Y|M|W|D|LY|LM)$/i;
    if (inpt.match(re) === null) {
        return false;
    } else {
        return true;
    }
};
//I need the following results:
console.log(isValid("1Y")); // true
console.log(isValid("1y")); //true
console.log(isValid("1YY")); //false
console.log(isValid("1mm")); //false
console.log(isValid("1LY")); //true
console.log(isValid("Y1")); //false

您需要替换字符类,该类别仅指定字符应以模式的内容,因为您需要捕获诸如LYLM之类的模式;如果要匹配完整的字符串,请使用锚点^$表示字符串的开始和结尾:

var sample = ["1Y",  // true
              "1y",  // true
              "1YY", // false
              "1mm", // false
              "1LY", // true
              "Y1"]  // false
console.log(
  sample.map(s => /^[0-9]+(Y|M|W|D|LY|LM)$/i.test(s))
)

在这里查看我的示例。

function isValid (inpt) {
    var re = /^[0-9]+(Y|M|W|D|LY|LM)$/i;
    if (inpt.match(re) === null) {
        return false;
    } else {
        return true;
    }
}

诸如1岁之类的模式匹配的原因是因为1y是完全有效的,即使其遵循的是其他不符合模式的字符。因此,A ^和$围绕正则表达式,以确保它与此匹配。

如果您想将几个规则结合在一起,则需要找出一种可以易于区分的方法(否则,您就输入了一项规则结束的地方,另一个规则开始的讨论)。

希望有帮助!

相关内容

最新更新