无论写入多么不同,都要替换所有出现的字符串

时间:2018-03-06 00:51:21

标签: javascript

我试图看看是否可以用简单的JavaScript实现这一点。

假设我有一个字符串:

var ourstring = "Blah TEST ('1')  TEST('2') Blah BLah TEST ( '1' )  TEST( '2' )";

请注意在字符串中写入不同的TEST('1')

我们如何检测字符串中的所有TEST(''),无论它写的有多么不同,并根据括号的包含用其他内容替换它们。

所以TEST ('1')改为TEST('1.node')。这是可能的,如果是,请告诉我并逐步解释,以便我可以从中学习。

我已经搜索过这样的解决方案,但找不到任何东西。问题我不知道该怎么做。请告诉我。

3 个答案:

答案 0 :(得分:2)

使用正则表达式:

    let str = "TEST ('1')  TEST('2') Blah BLah TEST ( '1' )  TEST( '2' )";
    const re = /TEST\s*\(\s*'([\d]*?)'\s*\)/g;
    str = str.replace(re, "TEST('$1.node')");
    console.log(str)
    /* str becomes:
       "TEST('1.node')  TEST('2.node') Blah BLah TEST('1.node')  TEST('2.node')"
    */

逐步打破正则表达式:

  1. TEST与文字完全匹配
  2. \s?表示可选的空格; \s表示任何空白字符,?表示可选
  3. \(匹配括号;它必须被转义,因为(与正则表达式中的分组相关
  4. ([\d]*)匹配[]之间的字符(在这种情况下只是数字,\d)0次。由于它在()之间,因此该值将被选为匹配组,并在替换字符串中以$1形式提供
  5. g最后是贪婪的,意味着在给定的字符串中尽可能多地匹配
  6. 根据您的目标,您希望在空格后用?替换可选(*)以表示0多个空白字符。

答案 1 :(得分:1)

此正则表达式/(TEST)\s*\((\s*)'([\d]?)'(\s*)\)/g捕获了五个组:

  1. Word TEST
  2. TEST与第一个(
  3. 之间的空格
  4. '与内部号码之间的空格。
  5. 内在号码。
  6. '与最后)之间的空格。
  7. 使用这五个组,您可以构建精确的结构+单词node

    var ourstring = "Blah TEST ('1')  TEST('2') Blah BLah TEST (      '1' )  TEST( '2'      )";
    console.log(ourstring.replace(/(TEST)(\s*)\((\s*)'([\d])'(\s*)\)/g, "$1$2($3'$4.node'$5)"))
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    此方法用于检查捕获的组以决定要替换的所需值。

    var ourstring = "Blah TEST ('1')  TEST('2') Blah BLah TEST (      '1' )  TEST( '2'      )";
    console.log(ourstring.replace(/'([\d])'/g, function(match, group) {
      if (group === '1') {
        return `'${group}.nodeOne'`;
      }
      
      if (group === '2') {
        return `'${group}.nodeTwo'`;
      }
    }))
    .as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

您正在寻找的是正则表达式替换。您需要编写一个与您要更改的文本匹配的正则表达式,然后将其与String.replace一起使用。

var newString = ourString.replace(/(TEST\('\d+)('\))/gi, function(match, group1, group2) {
   return group1+'.node'+group2;
});

其中重要的部分是正则表达式:     (TEST( '\ d +)('))

这匹配TEST后跟括号,引号和一个或多个数字,然后结束引号和括号。 它将第一部分(例如TEST('1)放入捕获组,然后对第二部分('))执行相同操作。

这些应最终包含在group1group2个变量中。 然后功能就是将这些功能再次拼接在一起,并在中间加上.node

修改

你可以捕获数字,然后根据它确定要返回的内容:

var newString = ourString.replace(/TEST\('(\d+)'\)/gi, function(match, num) {
   if(num == '1')
        return "TEST('1.node')";
   else
        return "TEST('1.otherThing')";
});

在正则表达式中要注意的是,文字括号与字符串\(中的内容匹配,并且有捕获组(未转义的括号)。