使用正则表达式匹配文本,但如果文本在某些字符内,则不匹配

时间:2017-03-18 18:34:58

标签: javascript regex

考虑以下文字

  

测试这个$测试这个$测试这个

如果我使用javascript的替换函数replace(/test/g, "9");,则会生成以下输出

  

这个9美元这个9美元这个

如何指定排除$$之间的任何解析,以便我得到以下输出

  

9这个$测试这个$ 9这个

我可以使用匹配/\$[^$]*\$|(test)/的回调函数生成所需的输出但是有一个简单的方法吗?请帮忙

3 个答案:

答案 0 :(得分:1)

这有点笨拙,但有效。您可以在$上展开字符串,然后重新组合它:

function toNine(str) {
    return str.replace(/test/g, '9');
}

function transformInput(input) {
    portions = input.split('$');
    return toNine(portions[0]) +
        '$' + portions[1] + '$' +
        toNine(portions[2]);
}

const input = 'testing this $testing this$ testing this';
console.log(transformInput(input));

答案 1 :(得分:1)

查找((?:\$[^$]*\$[^$]*?)*?)test
替换${1}9

测试
https://regex101.com/r/XevoHB/1

Exoanded

 (                             # (1 start)
      (?:
           \$ [^$]* \$ 
           [^$]*? 
      )*?
 )                             # (1 end)
 test

JS代码

const regex = /((?:\$[^$]*\$[^$]*?)*?)test/g;
const str = `testing this \$testing this\$ testing this`;
const subst = `${1}9`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

答案 2 :(得分:-2)

你可以使用:

/[$]test/g      //correspond to all occurrences of "test" with the '$' char before 

所以有3行:

var text = "testing this $testing this$ testing this";

text=text.replace(/[$]test/g, "ignore"); 
text=text.replace(/test/g, "9");
text=text.replace(/ignore/g, "$test");

EDIT(没有标记错误的解决方案):

var text = "testing this $testing this$ testing this ";
var array = text.split(" ");

for (var i=0; i<array.length; i++){

    if (array[i].contains("$test")){ 
      //do nothing 
    }
    else{
      array[i] = array[i].replace(/test/g, "9");
    }
}

text = array.join(" ");