正则表达式匹配匹配集之后的所有内容(匹配集除外)

时间:2018-07-03 12:32:51

标签: javascript regex

这可能是一个简单的表达方式,但是我很难过。我需要匹配每个组有2个部分的组集,我们可以称其为操作和值。除了其他操作,我需要该值匹配任何内容。

要匹配的有效运算(标准数学运算符):[>,<,=,!,....]

例如:'>=25!30<50'将导致三个匹配的组:

1. (>=, 25) 2. (!, 30) 3. (<, 50)

我目前可以使用/(>=|<=|>|<|!|=)(\d*)/g解决以上问题,但这仅在第二个匹配集中的字符是数字时才有效。

我碰到的那堵墙是如何匹配除指定操作员之外的所有内容。

例如,我不知道如何解决:'<=2017-01-01'无需编写正则表达式来指定我允许的每个字符(除运算符外的任何其他字符),而且看起来似乎不正确解决方案。

必须有一种方法可以做到这一点!谢谢大家。

3 个答案:

答案 0 :(得分:0)

我认为这是您所需要的:

/(>=|<=|>|<|!|=)[^>=<!]+/g

^排除您不需要的字符,+表示任意数量的

答案 1 :(得分:0)

您可以使用此代码

var str = ">=25!30<50";
var pattern = RegExp(/(?:([\<\>\=\!]{1,2})(\d+))/, "g");
var output = [];
let matchs = null;


while((matchs = pattern.exec(str)) != null) {

    output.push([matchs[1], matchs[2]]);
}

console.log(output);

输出数组:

0: Array [ ">=", "25" ]
​
1: Array [ "!", "30" ]
​
2: Array [ "<", "50" ]

答案 2 :(得分:0)

您可能要做的是匹配操作(>=|<=|>|<|!|=),这将是两部分中的第一部分,并且在捕获组中使用负前瞻进行匹配,而右侧没有直接进行的操作这两个部分中的第二个。

(?:>=|<=|>|<|!|=)((?:(?!(?:>=|<=|>|<|!|=)).)+)

  • (?:>=|<=|>|<|!|=)使用轮换方式匹配其中一项操作
  • (开始捕获组(其中将包含您的值)
    • (?:启动非捕获组
      • (?!(?:>=|<=|>|<|!|=)).断言右边的否定词不是操作,并且匹配任何字符.
    • )+关闭非捕获组并重复一次或多次
  • )关闭捕获组

const regex = /(?:>=|<=|>|<|!|=)((?:(?!(?:>=|<=|>|<|!|=)).)+)/gm;
const strings = [
  ">=25!30<50",
  ">=test!30<$@#%",
  "34"
];
let m;

strings.forEach((s) => {
  while ((m = regex.exec(s)) !== null) {
    if (m.index === regex.lastIndex) {
      regex.lastIndex++;
    }
    console.log(m[1]);
  }
});