2016-07-15 154 views
0

我一直在想出一個正則表達式,它將替換可能包含或不包含重音字符的單詞。過去幾天我一直在研究這個問題,但找不到我需要的信息來解決我的問題。Javascript正則表達式替換可能包含重音字符的單詞

我想出了一個簡單的正則表達式來處理的話沒有大的重音字符:

var re = new RegExp('(?:\\b)hello(?:\\b)', 'gm'); 
var string = 'hello hello hello world hellos hello'; 
string.replace(re, "FOO"); 

結果:FOO FOO FOO world hellos FOO

上述工作,因爲我想。上述代碼的問題是當單詞包含重音字符作爲字符串中的第一個或最後一個字符時。例如:

var re = new RegExp('(?:\\b)helló(?:\\b)', 'gm'); 
var string = 'helló helló helló world hellós helló'; 
string.replace(re, "FOO"); 

結果:helló helló helló world FOOs helló

期望的結果:FOO FOO FOO world hellós FOO

從我的理解,上面的發生,因爲重音字符被解釋爲一個邊界。我在解決問題的嘗試(注:範圍[A-zÀ-ÿ]是什麼,我認爲有效的字母來構建一個詞):

var re = new RegExp('([^A-zÀ-ÿ]|^)helló([^A-zÀ-ÿ]|$)', 'gm'); 
var string = 'helló helló helló world hellós helló'; 
string.replace(re, "$1FOO$2"); 

結果:FOO helló FOO world hellós FOO

正如你所看到的,我更接近期望的結果。但是,問題在連續出現三次或更多次時出現。請注意第二次出現helló被忽略。我相信這是因爲它之前的空白已經與helló的第一次匹配。

有沒有人有關於如何實現FOO FOO FOO world hellós FOO的建議?

+0

很可能是http://stackoverflow.com/questions/5436824/matching-accented-characters-with-javascript-regexes的副本,但我沒有使用哈默直到確認 – mplungjan

+0

您能否準確解釋需求是什麼匹配這個詞?它是否替換爲字符串內或特定位置的任何實例?所以,而不是那個正則表達式爲什麼不''helló\ B'? – 10100111001

回答

2

答案是有點複雜,但在下面,爲什麼你在這個問題上糾纏已經回答了:,Why can't I use accented characters next to a word boundary?

但是由於缺乏在Javascript不錯的Unicode支持,特別是ECMAScript的前6(過去我自己也有過這個問題)。我發現使用具有更好的Unicode支持的第三方庫通常會更好,例如:http://xregexp.com/

這也消除了舊版瀏覽器支持的某些差異。