我正在编写一种方法来检查输入是否匹配
>=n, >n, <n, <=n or n..n.
正则表达式一直令人困惑。我觉得这是一个更好地理解它的好例子。
到目前为止,我只是检查它是否包含那些字符
const text = '>2';
const regex = /^[<>=.0-9]|g/i;
console.log(regex.test(text));
如何创建仅允许这些特定模式/量词的正则表达式?例如。 >5
有效,而5>
无效。
这类事情背后的术语是什么?
答案 0 :(得分:1)
您可以使用alternation来匹配>
或<
,后跟可选的=
,或者匹配一个数字,后跟2个点。
轮换后,您可以匹配一个数字。
^(?:[<>]=?|\d\.\.)\d$
这将匹配:
^
字符串的开头(?:
非捕获组
[<>]=?
匹配<或>或可选= |
或\d\.\.
匹配一个数字和2个点)
关闭非捕获组\d
匹配数字$
声明字符串的结尾
const strings = [
">=3",
">3",
"<2",
"<=3",
"5..5",
"5>"
];
let pattern = /^(?:[<>]=?|\d\.\.)\d$/;
strings.forEach(s => {
console.log(pattern.test(s));
});
答案 1 :(得分:1)
您必须注意顺序,并且要更加准确:
^(?:>|<|>=|<=)(?:[1-9]\d*|0)$
(?:>|<|>=|<=)
是有效的运算符集(?:[1-9][0-9]*|0)
是不带前导零的数字因此完整的regex
变量将被初始化为:
regex = /^(?:>|<|>=|<=)(?:[1-9]\d*|0)$|g/i;
您已包括匹配n..n
作为替代。在这里,您去了:
^((>|<|>=|<=)|([1-9]\d*|0)\.\.)([1-9]\d*|0)$
\.
从字面上匹配.
点,必须将其转义测试:
regex = /^((>|<|>=|<=)|([1-9]\d*|0)\.\.)([1-9]\d*|0)$|g/i;
array = new Array();
array[0] = ">2"; // valid
array[1] = ">0"; // valid
array[2] = "2..3" // valid
array[3] = "=2"; // invalid
array[4] = ">01"; // invalid
array[5] = "2>"; // invalid
array.forEach(item => console.log(regex.test(item)));
如果您不介意前导零,只需使用:
^((>|<|>=|<=)|\d*\.\.)\d*$
答案 2 :(得分:0)