2012-07-16 33 views
3

我有以下字符串什麼是JavaScript的

sssHi這是正則表達式測試正則表達式,SR,你好,這是正則表達式測試

我想只能更換

你好,這是正則表達式測試

段與其他一些字符串。

在字符串中的第一段「SSS 你好,這是測試對正則表達式」不應該被更換

我寫了下面的相同的正則表達式:

/([^.]Hi\sthis\sis\sthe\stest\sfor\sregular\sExpression)|(Hi\sthis\sis\sthe\stest\sfor\sregular\sExpression)$/ 

但兩個細分匹配。我想只匹配第二個,因爲第一個字母的前綴是「sss」。

[^.]  

應該除了換行符之外什麼都不能匹配?所以羣組

"([^.]anystring)" 

應該只匹配除了換行符之外沒有任何chanrachter的「anystring」。 我正確嗎?

任何想法。

+3

。括號內的操作符與外部操作符不同。在括號內,它是一個字面句點(。) – Exupery 2012-07-16 12:51:40

+5

使用'\ b'。例如'\ B(你好,這是test' ...')\ B' – 2012-07-16 12:51:49

+0

閱讀'lookahead'和'lookbehind'斷言[這裏](http://www.regular-expressions.info/lookaround.html#lookahead) – diEcho 2012-07-16 12:58:57

回答

3

匹配而不是的字符串是negative lookbehind,不支持JavaScript正則表達式引擎。但是,您可以使用回調來執行此操作。

鑑於

str = "sssHi this is the test for regular Expression,sr,Hi this is the test for regular Expression" 

使用一個回調來檢查字符前面str

str.replace(/(.)Hi this is the test for regular Expression$/g, function($0,$1){ return $1 == "s" ? $0 : $1 + "replacement"; }) 
// => "sssHi this is the test for regular Expression,sr,replacement" 

正則表達式兩個字符串匹配,從而在回調函數被調用兩次:

  1. 隨着
    • $0 = "sHi this is the test for regular Expression"
    • $1 = "s"
  2. 隨着
    • $0 = ",Hi this is the test for regular Expression"
    • $1 = ","

如果$1 == "s"比賽被$0更換,所以它仍然保持不變,否則就被替換$1 + "replacement"

另一種方法是第二個字符串匹配,即要更換,包括分隔符。

要匹配str之前用逗號:

str.replace(/,Hi this is the test for regular Expression/g, ",replacement") 
// => "sssHi this is the test for regular Expression,sr,replacement" 

要匹配str由任何非單詞字符之前:

str.replace(/Hi this is the test for regular Expression$/g, "replacement") 
// => "sssHi this is the test for regular Expression,sr,replacement" 

str.replace(/(\W)Hi this is the test for regular Expression/g, "$1replacement") 
// => "sssHi this is the test for regular Expression,sr,replacement" 

要在一行的末尾匹配str

0

使用

str.replace(/(.*)Hi this is the test for regular Expression/,"$1yourstring") 

。*是貪婪的,因此匹配可能最長的字符串,留下其餘爲你想匹配明確字符串。