正则表达式不解析连续出现的模式

时间:2014-11-23 12:57:46

标签: javascript regex

我正在尝试在JavaScript中编写一个正则表达式,以将\123之类的模式的出现解析为相应的数字ASCII值。 65替换为A,依此类推。

\本身可以\\转义,以便\\65成为\65

我面临的问题是,连续出现的主模式未正确解析 \65#\97变为A#a。但\65\97仅变为A\97

代码的核心部分如下:

// Parse \65 but not \\65
input = input.replace(/(^|[^\\]{1})\\(\d{1,3})/g, function (m0, m1, m2) {
    var n = parseInt(m2);
    if (n < 256) {
        return m1 + String.fromCharCode(n);
    } else {
        return m0;
    }
});  

可以使用here

来说明相同的小提琴

我猜这个错误与正则表达式有关,但是到目前为止我还没有弄清楚 等待对此有任何见解:]

2 个答案:

答案 0 :(得分:1)

我认为简单的答案是匹配反斜杠后跟反斜杠或数字序列。如果后跟一个数字序列,请检查该值并进行替换:

var input = "Do these: \\65\\97 \\66#\\97 But not: \\\\65\\\\97 Do this: \\\\\\65";
snippet.log("Before: " + input);
input = input.replace(/\\(\\|\d+)/g, function(m, c) {
  var val;
  if (c !== "\\") {
    val = +c;
    if (val >= 0 && val <= 255) {
      return String.fromCharCode(val);
    }
  }
  return m;
});
snippet.log("After: " + input);
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

答案 1 :(得分:1)

您可以在正则表达式中同时捕获\\\97之类的代码,并保持\\和255以上的代码不变:

&#13;
&#13;
var input = "\\\\42This is \\97 \\116\\101st.\\\\256";

input = input.replace(/(\\\\|\\\d{1,3})/g, function (m) {
  if (m != '\\\\') {  
    var n = parseInt(m.substr(1), 10);
    if (n < 256) {
       m = String.fromCharCode(n);
    }
  }
  return m;
});

document.write(input);
&#13;
&#13;
&#13;