3

我有以下字符串

sssHi 这是正则表达式的测试,sr,Hi 这是正则表达式的测试

我只想更换

嗨,这是正则表达式的测试

与其他字符串分段。

不应替换字符串“sss Hi 这是正则表达式的测试”中的第一段

我为相同的内容编写了以下正则表达式:

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

但它匹配两个部分。我只想匹配第二个,因为第一个段以“sss”为前缀。

[^.]      

除了换行符之外什么都不匹配吗?所以组

  "([^.]anystring)"

应该只匹配除换行符之外没有任何字符前面的“anystring”。我对么?

有什么想法吗。

4

2 回答 2

3

匹配一个前面没有另一个字符串的字符串是一种否定的后向查找,并且 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"

正则表达式匹配两个字符串,因此回调函数被调用两次:

    • $0 = "sHi this is the test for regular Expression"
    • $1 = "s"
    • $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(/(\W)Hi this is the test for regular Expression/g, "$1replacement")
// => "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"
于 2012-07-16T13:40:02.627 回答
0

采用

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

. *是贪心的,因此匹配最长的字符串,剩下的留给你想要匹配的显式字符串。

于 2012-07-16T15:35:12.543 回答