反转一组相当复杂的正则表达式

时间:2014-11-23 01:07:35

标签: javascript regex regex-negation

我对正则表达式有点新鲜,我在网上找到的解决方案都没有帮助/工作。

我正在处理JavaScript中的单行字符串,它将包含五种类型的数据。

  • “#”后跟六个数字/字母(HTML颜色)(/#....../g
  • 正斜杠后跟任意一些特定字符(/\/(\+|\^|\-|#|!\+|_|@|\*|%|&|~)/g
  • 一个“$”后跟一系列字母和一个“|” (/\$([^\|]+)/g
  • A“|”单独(/\|/g
  • 不属于这些类别的字母数字字符

问题是,我有正则表达式匹配前四个类别,这很重要。 问题是我需要一个正则表达式,我将用它替换所有与前四个正则表达式不匹配的字符,例如“§”。

示例:

This#00CC00 is green$Courier| and /^mono|spaced

§§§§#00CC00§§§§§§§§§$Courier|§§§§§/^§§§§|§§§§§§

我知道我可能会以错误的方式攻击这个问题,我对正则表达式比较陌生。 基本上,我如何制作一个正则表达式,意思是“任何与正则表达式x,y或z没有任何匹配的东西”?

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

使用此模式

((#\w{6}|\/[\/\(\+\^\-]|\$\w+\||\|)*).

并替换w / $1§
缺点是你保留的模式必须至少跟随一个字符
Demo

(                   # Capturing Group (1)
  (                 # Capturing Group (2)
    #               # "#"
    \w              # <ASCII letter, digit or underscore>
    {6}             # (repeated {6} times)
    |               # OR
    \/              # "/"
    [\/\(\+\^\-]    # Character Class [\/\(\+\^\-]
    |               # OR
    \$              # "$"
    \w              # <ASCII letter, digit or underscore>
    +               # (one or more)(greedy)
    \|              # "|"
    |               # OR
    \|              # "|"
  )                 # End of Capturing Group (2)
  *                 # (zero or more)(greedy)
)                   # End of Capturing Group (1)
.                   # Any character except line break  

从Regex101复制的代码

var re = /((#\w{6}|\/[\/\(\+\^\-]|\$\w+\||\|)*)./gm;   
var str = 'This#00CC00 is green$Courier| and /^mono|spaced|\n';  
var subst = '$1§';   
var result = str.replace(re, subst);

答案 1 :(得分:1)

这不如工作正则表达式有效,但它有效。基本上它获取所有匹配并用§个字符填充部分。一个好处是你不必成为一个正则表达天才来更新它,所以希望更多的人可以使用它。

var str = 'This#00CC00 is green$Courier| and /^mono|spaced';
var patt=/#(\d|\w){6}|\/(\+|\^|\-|#|!\+|_|@|\*|%|&|~)|\$([^\|]+)\||\|/g;
var ret = "";

pos = [];
while (match=patt.exec(str)) {
    pos.push(match.index);
    pos.push(patt.lastIndex);
    console.log(match.index + ' ' + patt.lastIndex);
}

for (var i=0; i<pos.length; i+=2) {
    ret += Array(1+pos[i]- (i==0 ? 0 : pos[i-1])).join("§");
    ret += str.substring(pos[i], pos[i+1]);
}
ret += Array(1+str.length-pos[pos.length-1]).join("§");

document.body.innerHTML = str +"<br>"+ret;

console.log(str);
console.log(ret);

demo here