2014-11-23 71 views
0

我想在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

我猜誤差與正則表達式做小提琴,但沒有我自己看着辦到目前爲止。
等待任何見解:]

回答

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>

+0

啊,我剛剛到達那裏。你*超過了我* * *! :-) – deitch 2014-11-23 13:07:04

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);