2011-10-06 51 views
1

希望逃避所有出現的「。」。和 「:」 方括號內,無法替換()使用子匹配

[ab:1.2:ef]='12.3' => [ab\:1\.2\:ef]='12.3' 

嘗試不同的排列上replace,例如,

str.replace(/(\[.*)(\.|:)(.*\])/g, '\1\\\2\3'); 

,但沒有喜悅。


這兩個答案正確,更多。

首先,純模式匹配,完成工作,非常簡潔。在我看來,它更好地回答了陳述的問題。

第二個,調用replace帶有一個函數arg,稍微有點強壯,並且提供了更多的靈活性。在我的代碼中使用這種方法,因爲它可以輕鬆處理一些特殊情況。

回答

2

假設括號總是正確地平衡(甚至在字符串或註釋)和永遠不能嵌套或逃跑了,你可以使用lookahead assertions在一個單一的正則表達式解決這個問題:

result = subject.replace(/([:.])(?=[^[\]]*\])/g, "\\$1"); 

作爲評論的正則表達式:

([:.]) # Match and remember a dot/colon, 
(?=  # only if it is followed by: 
[^[\]]* # any number of characters excluding brackets, 
\]  # followed by a closing bracket. 
)   # End of lookahead assertion. 

向前確保在我們看到的點/冒號後面的下一個括號是閉括號。

+0

很好的解釋。讓我感到驚訝的是,你並不擔心領導支架(因爲它必須在那裏) - 使匹配更加複雜。 –

+0

這不需要打開和關閉大括號。因此,它不適用於:[[ab:1.2:ef] ='12.3]'或'ab:1.2:ef] ='12.3'。 – jfriend00

+0

對,這就是爲什麼我寫了括號必須正確平衡(JavaScript不支持後向斷言)。我應該補充一點,這也涉及到字符串中的括號,註釋等。 –

1

我只知道如何與替換功能做到這一點:

var test = "[ab:1.2:ef]='12.3'"; 

var out = test.replace(/\[.*?\]/g, function(str) { 
    return(str.replace(/\.|:/g, "\\$&")); 
}); 

// out is [ab\:1\.2\:ef]='12.3' 

看到它在這裏的行動:http://jsfiddle.net/jfriend00/ZHVjW/

+0

哇!從來沒有在'replace'中看到過用作參數的函數 - 非常酷。比以前使用的'match'循環更優雅。謝謝! –

+0

關於你對我的回答的評論,你的正則表達式也會出現字符串中不平衡括號的問題,比如'[ab:1.2] ='[12.3'; [cd:3.4] = '34.5]''。只要分隔符不平衡和/或內部字符串/註釋,正則表達式開始失敗,並且您需要解析器來完成這種工作。 –

+0

是的,在完成工作和展示大鐵之間有一條細線。也就是說,你是否知道將一個(有點)任意字符串轉換爲波蘭式樹結構的實用程序? –