我正在尝试编写与一串数字匹配的正则表达式,然后是特定的字母。
有效的字母为: 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)
几件事:
-
您拥有的是一个字符串,而不是正则表达式,尽管
String.prototype.match
会为您通过new RegExp
运行。最好用字面符号(/expression/
)编写正则表达式。 -
[Y|M|W|D|LY|LM]
是一个角色类,说"匹配y,|,m,d或l"。对于交替,使用组;因为在您的情况下,您不需要捕获结果,所以一个非捕获组:(?:Y|M|W|D|LY|LM)
-
进行不敏感的匹配,使用
i
标志。 -
说"匹配此匹配,但不遵循","使用负面的外观:
(?!...)
。(但是继续阅读,我怀疑您不想这样做。)
因此您可以使用:
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
您需要替换字符类,该类别仅指定字符应以或模式的内容,因为您需要捕获诸如LY
和LM
之类的模式;如果要匹配完整的字符串,请使用锚点^
和$
表示字符串的开始和结尾:
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 ^和$围绕正则表达式,以确保它与此匹配。
如果您想将几个规则结合在一起,则需要找出一种可以易于区分的方法(否则,您就输入了一项规则结束的地方,另一个规则开始的讨论)。
希望有帮助!