JavaScript:使用正则表达式将字符串中所有“a”的出现替换为“b”。

4
我有一个字符串,类似于 'a b b b a',想要用一个不同的字符替换该字符串中每个在其前后都有空格的'b'字符。如何使用正则表达式实现呢?我的想法是这样的:
'x a y a x'.replace(new RegExp(' a ', 'g'), ' b '); // is: x b y b x, should: x b y b x (correct)
'x a a a x'.replace(new RegExp(' a ', 'g'), ' b '); // is: x b a b x, should: x b b b x (wrong)
'x aa x'.replace(new RegExp(' a ', 'g'), ' b '); // is: x aa x, should: x aa x (correct)

但是,如果一个字符的多个出现次数相邻,那么该正则表达式只能匹配其中一个。如何编写正则表达式以获取正确的行为?


a+ instead of only a - mic4ael
正则表达式会读取每个字符,等待找到第一个 'a',就像这样:'x[ a ]a a x',然后替换它并继续处理下一部分 'a a x'。它会跳过下一个 'a',因为它前面没有空格,忽略了那个 'a'。这就是为什么你得到 'x b a b x'。 - Some Dinosaur
3个回答

6
使用 "a" 后的前瞻来匹配重叠的子字符串:
/ a(?= )/g

或者,为了匹配任何空格,将空格替换为\s
由于前瞻是一个零宽度断言,所以它不会消耗文本,因此在“ a”后面的空格将可用于下一次匹配(模式中的第一个空格是消耗模式的一部分)。
请参见正则表达式演示

var regex = / a(?= )/g;
var strs = ['x a y a x', 'x a a a x', 'x aa x'];
for (var str of strs) {
 console.log(str,' => ', str.replace(regex, " b"));
}


3
由于您的匹配重叠,您可以使用零宽断言,即基于正向先行断言的正则表达式:
作为您的匹配项重叠,您可以使用零宽度断言,即基于正向先行断言的正则表达式:
str = str.replace(/( )a(?= )/g, "\1b");

正则表达式演示

  • ( )a 匹配 a 前的空格,并在第一组中捕获,然后匹配 a
  • (?= ) 断言 a 后面有一个空格但不会在匹配中消耗掉它。

0

您可以使用带有g标志的RegExp与replace方法一起使用。试试这个:

var mystring = "this is a a a a a a test"
mystring.replace(/ a /g , "b");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接