【问题标题】:Javascript: Replace all occurences of ' a ' in a string with ' b ' with a regexJavascript:用正则表达式将字符串中所有出现的“a”替换为“b”
【发布时间】:2016-10-19 11:56:37
【问题描述】:

我有一个类似 '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)

但该正则表达式仅在该字符的另一个出现旁边不超过 1 次出现时才有效。我如何编写正则表达式以获得正确的行为?

【问题讨论】:

  • a+ 而不仅仅是a
  • Regex 正在读取每个等待获取 'a' 的字符,当它到达第一个字符时,如下所示:'x[ a ]a a x' 它会替换它并继续到下一个位 'a a x'。它跳过下一个“a”,因为它前面没有空格,忽略那个“a”。这就是为什么你会得到'x b a b x'

标签: javascript regex string replace


【解决方案1】:

在“a”之后使用前瞻来匹配重叠的子字符串:

/ a(?= )/g

或者,要匹配任何空格,请将空格替换为 \s

lookahead,作为zero-width assertion,不消耗文本,因此“a”之后的空格将可用于下一次匹配(模式中的第一个空格是消耗模式的一部分)。

regex demo

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"));
}

【讨论】:

    【解决方案2】:

    由于您的匹配项是重叠的,您可以使用零宽度断言,即基于正则表达式的积极前瞻:

    str = str.replace(/( )a(?= )/g, "\1b");
    

    RegEx Demo

    • ( )a 将匹配a 之前的空格并将其捕获到组#1 中,然后是a
    • (?= ) 将断言在 a 之后存在一个空格,但不会在匹配中使用它。

    【讨论】:

      【解决方案3】:

      您可以通过replace 方法使用带有g 标志的RegExp。试试这个

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

      【讨论】:

        猜你喜欢
        • 2017-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        • 1970-01-01
        • 2013-01-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多