只允许使用带有特定字符正则表达式的特定模式-javascript

时间:2018-11-28 21:16:03

标签: javascript regex

我正在编写一种方法来检查输入是否匹配

>=n, >n, <n, <=n or n..n.

正则表达式一直令人困惑。我觉得这是一个更好地理解它的好例子。

到目前为止,我只是检查它是否包含那些字符

const text = '>2';
const regex = /^[<>=.0-9]|g/i;
console.log(regex.test(text));

如何创建仅允许这些特定模式/量词的正则表达式?例如。 >5有效,而5>无效。

这类事情背后的术语是什么?

3 个答案:

答案 0 :(得分:1)

您可以使用alternation来匹配><,后跟可选的=,或者匹配一个数字,后跟2个点。

轮换后,您可以匹配一个数字。

^(?:[<>]=?|\d\.\.)\d$

这将匹配:

  • ^字符串的开头
  • (?:非捕获组
    • [<>]=?匹配<或>或可选=
    • |
    • \d\.\.匹配一个数字和2个点
  • )关闭非捕获组
  • \d匹配数字
  • $声明字符串的结尾

Regex demo

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)

您可能可以使用^[<>]=?\d+$

  • ^从字符串开头开始匹配
  • [<>]强制性或大或小的标记
  • =?可选的等号
  • \d+任意位数
  • $匹配到字符串结尾

Demo