我正在尝试在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
来说明相同的小提琴我猜这个错误与正则表达式有关,但是到目前为止我还没有弄清楚 等待对此有任何见解:]
答案 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以上的代码不变:
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;