2016-08-24 70 views
1

我試圖在Javascript中找到一個看似簡單的問題的正則表達式,但我一直在關於它的整個早上都在打擊我的頭。我試圖用string.match來計算字符串中出現的引號符號。值得注意的是,不應該計算出逃脫的引號符號,但是前面帶有反斜槓的引號應該是再次。Javascript正則表達式:計算字符串中的未轉義引號

作爲輔助信息,我只是試圖查看該行中是否存在所有字符串都已正確關閉,並且我推測如果出現這種情況,行中應該存在相同數量的引號。

舉幾個例子:

'"I am string 1" "I am string 2"' 

顯然應該算4個報價

'"I am \"string 1\"" "I am string 2"' 

還是應該算4個報價爲內部串1應跳過逃脫的人。

'"I am string 1\\" "I am string 2"' 

應該算4個引號,因爲\在第二的前「由\才逃過一劫。

我已經找到了正則表達式,其確實在紅寶石的工作(在PCRE格式化),但它使用結構不Javascript中存在,如負lookbehinds (?>!和重置匹配\K

(?<!\\)(?:\\{2})*\K" 

我試圖把它轉變爲一個Javascript正則表達式的起點,但無濟於事。

我估計像

(?:\\(?="))|(") 

(匹配一個斜線,然後在自己的一個「或斜線) 應該做的伎倆,但它不工作,甚至不考慮問題。任何人都可以帶領我?非常感謝!

回答

2

你需要一個小的解析器來處理這個任務,因爲沒有\G操作,可以錨隨後的比賽到以前的成功比賽結束。

var s = "\"some text\" with 5 unescaped double quotes... \\\"extras\" \\some \\\"string \\\" right\" here \""; 
 

 
var res = 0; 
 
var in_entity = false; 
 
for (var i=0; i<s.length; i++) { 
 
    if ((s[i] === '\\' && !in_entity) || in_entity) { // reverse the flag 
 
    in_entity = !in_entity; 
 
    } else if (s[i] === '"' && !in_entity) { // an unescaped " 
 
     res += 1; 
 
    } 
 
} 
 
console.log(s,": ", res);

+0

謝謝!這似乎是爲了完成這項工作。它只是讓我感到無法用Javascript中的一個正則表達式來解決這個問題。這似乎很簡單。 –

+0

這對JS中的正則表達式不是基本的。在.NET中,你可以使用像''(? (%3F%3A%5B%5E%22%5C%5C%5D%7C(%22)%7C%5C%5C)。*%24&I =%22text +%5C%22more%5C%22 +文本%22 +和+ no + more +%22escaped%22 + quotes)並計算第1組捕獲的數量。 Python PyPi正則表達式和Boost正則表達式庫(支持捕獲集合)的特定構建也可以做到這一點。 –

+0

是的,我只是。這似乎是JavaScript中唯一可能的選擇。再次感謝! –

0

您可以使用此正則表達式來抓住比賽和計數導致數組的長度:

var arr=['"I am string 1" "I am string 2"', 
 
     '"I am \\"string 1\\"" "I am string 2"', 
 
     '"I am string 1\\\\" "I am string 2"' 
 
     ]; 
 

 
for (i=0; i<arr.length; i++) { 
 
    console.log(arr[i].match(/"[^"\\]*(?:\\.[^"\\]*)*"/g).length * 2) 
 
}

/"[^"\\]*(?:\\.[^"\\]*)*"/將匹配引用字符串消費裏面所有的轉義字符。

RegEx Demo

輸出:

4 
4 
4 
+0

如果輸入有逃脫'「這將失敗'第一。事實是,你不能用JS正則表達式解決問題。寫一個小的解析器。 –

+0

是的,這個正則表達式只適用於帶有平衡引號的輸入。 – anubhava