我有以下字符串
sssHi这是对正则表达式的测试,sr,嗨,这是对正则表达式的测试
我想只替换
嗨,这是正则表达式的测试
使用其他字符串进行分段。
字符串中的第一段“sss 嗨这是正则表达式的测试”不应该被替换
我为此写了以下正则表达式:
/([^.]Hi\sthis\sis\sthe\stest\sfor\sregular\sExpression)|(Hi\sthis\sis\sthe\stest\sfor\sregular\sExpression)$/
但它匹配两个细分。我想只匹配第二个,因为第一个分段以“sss”为前缀。
[^.]
除了换行权之外,应该匹配什么?所以小组
"([^.]anystring)"
应该只匹配除了换行符之前没有任何chanrachter的“anystring”。 我是对的吗?
任何想法。
答案 0 :(得分: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"
正则表达式匹配两个字符串,因此调用回调函数两次:
$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"
答案 1 :(得分:0)
使用
str.replace(/(.*)Hi this is the test for regular Expression/,"$1yourstring")
。* 是贪婪的,因此匹配最长的字符串,剩下的就是你想要匹配的显式字符串。