【问题标题】:JS Regex - Match each not escaped specific charactersJS Regex - 匹配每个未转义的特定字符
【发布时间】:2015-03-05 22:51:01
【问题描述】:

我正在尝试在 JavaScript 中创建一个正则表达式来匹配每个未转义的特定字符。

我在这里寻找所有' 字符。它们可以在字符串的开头或结尾,并且是连续的。

例如:

'abc''abc\'abc

我应该得到 3 个匹配项:第 1 个、第 5 个和第 6 个字符。但不是第 11 个逃脱了。

【问题讨论】:

  • 所以您正在寻找',它的前面不是任何字符,也不是 ` \ ` 以外的任何字符。你能写出这样的正则表达式吗?

标签: javascript regex


【解决方案1】:

您必须考虑 \\' 应该匹配的情况和 \\\' 不应该匹配的情况。但是你在 JS 中没有lookbehinds,更不用说变长lookbehinds了,所以你必须使用别的东西。

使用以下正则表达式:

\\.|(')

这将匹配所有转义字符和您要查找的 ' 字符,但引号将位于捕获组中。

看看这个demo。您感兴趣的匹配项为绿色,要忽略的匹配项为蓝色。

然后,在 JS 中,忽略每个匹配对象 m 其中!m[1]

例子:

var input = "'abc''abc\\'abc \\\\' abc";
var re = /\\.|(')/g;
var m;
var positions = [];

while (m = re.exec(input)) {
  if (m[1])      
    positions.push(m.index);
}

var pos = [];
for (var i = 0; i < input.length; ++i) {
  pos.push(positions.indexOf(i) >= 0 ? "^" : " ");
}

document.getElementById("output").innerText = input + "\n" + pos.join("");
&lt;pre id="output"&gt;&lt;/pre&gt;

【讨论】:

    【解决方案2】:

    你可以使用:

    var s = "'abc''abc\\'abc";
    var cnt=0;
    s.replace(/\\?'/g, function($0) { if ($0[0] != '\\') cnt++; return $0;});
    
    console.log(cnt);
    //=> 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多