2011-03-10 25 views
1

你好,我需要更換子 例的單隻發生:正則表達式:僅匹配單個子發生

一些句子#X,#X,#X;與#x; #x;一些#x; words #x;需要更換。

需要更換隻有一個#x; by #y;並獲得以下字符串

一些句子#X,#X,#X;#x; #x;一些#y;單詞#y;需要更換。

一些注意事項:我的字符串將包含unicode字符並且operator \ b不起作用。

+0

請顯示您正在嘗試使用的代碼。 – HBP 2011-03-10 09:34:08

回答

2

可以匹配#X;重複任意次數,並在那裏發生一次只能更換那些:

sentence = sentence.replace(/((?:#x;)+)/g, function(m) { 
    return m.length == 3 ? '#y;' : m; 
}); 
+0

+1:我認爲這比後臺解決方法更好。這當然更容易閱讀。 – 2011-03-10 09:47:24

+0

謝謝你們的答案。這真的很有幫助。 – Ilya 2011-03-11 10:05:19

2

最簡單的正則表達式匹配的#x;單隻出現次數將使用回顧後和前向斷言。

/(?<!#x;)#x;(?!#x;)/ 

但JavaScript不支持lookbehinds所以你可以只使用向前看符號,而不是嘗試以下解決方法:

/(^[\S\s]{0,2}|(?!#x;)[\S\s]{3})#x;(?!#x;)/ 

完整的示例:

> s = 'Some sentence #x;#x;#x; with #x;#x; some #x; words #x; need in replacing.' 
> s = s.replace(/(^[\S\s]{0,2}|(?!#x;)[\S\s]{3})#x;(?!#x;)/g, '$1#y;') 
"Some sentence #x;#x;#x; with #x;#x; some #y; words #y; need in replacing." 
0

使用str.replace('/(#x;)+/g','#y;')

+1

我認爲你的意思是'/(#x;){1}/g'而不是''/#x; {1} /'',但是{1}'仍然不能替代每個它自己的發生。 – Guffa 2011-03-10 09:53:40

+0

@Guffa是的,我的意思是,感謝糾正我:) – diEcho 2011-03-10 09:56:00

+0

你仍然有它的撇號,所以它不是一個正則表達式,而是一個字符串。它會在字符串中尋找文本'/(#x;)+/g',而不是'#x;'。從'{1}'到'+'的變化意味着它將用'#y;'代替'#y; #y; #y;'代替'#x; #x; #x;',但它將不僅取代單一的發生。 – Guffa 2011-03-10 13:09:35

1

單個#x;可以通過之前和之後具有空格出線。 在這種情況下,您可以使用此:

str.replace(/(\s+)#x;(\s+)/g, '$1#y;$2') 
+0

謝謝你的回答,但句子可以沒有任何空格。 – Ilya 2011-03-11 09:19:14