Javascript正则表达式难以替换

时间:2013-08-22 12:35:51

标签: javascript regex

我是正则表达式的新手,你能帮我解决这个问题吗?

我想替换

  

一些文字和XXblaaaaa#和文字再次XXbl!abla#或XXblalala#或XXbabla#

  

一些文字和OOTEXT **和文字再次OOTEXT **或OOTEXT **

I made a jsfiddle to test t.

我测试的正则表达式为:/((XX).+?(?=(#)))/g;,即找到XX直到#

但是如何设置以下条件:如果#XX之间的字符串不包含#,请直到!

3 个答案:

答案 0 :(得分:1)

/XX[^!]*?#/g

这将替换从XX到#的所有内容,只要它不包含!

像这样使用:

"Some text and XXblaaaaa# and text again XXbl!abla# or XXblalala# or XXbabla#".replace(/XX[^!]*?#/g, "OOTEXT");

编辑:

更有效的版本是这样的:

    /XX[^!#]*#/g

如果你不想允许空格,那么在字符类中添加\s

/XX[^!#\s]*#/g

答案 1 :(得分:0)

您可以使用.replace(regex,function)的重载:

var txt = 'Some text and XXblaaaaa# and text again XXbl!abla# or XXblalala# or XXbabla#';
var result = .replace(/(XX.*?#)/g,function(m,a){
  // only replace values that do not contain a '!'
  return a.indexOf('!') == -1 ? 'OOTEXT**' : a;
});
// "Some text and OOTEXT** and text again XXbl!abla# or OOTEXT** or OOTEXT**"

我不确定你的例子是否真的那么简单,所以上面的方法具有很大的灵活性。您也可以使用[^!]*?代替.*?,但是比单个字符更复杂的东西需要更精细。

答案 2 :(得分:0)

我认为你想要的是这样的:

result = input.replace(/XX[^!#]*(?:![^#]*#[^!#]*)*#/g, "OOTEXT**");

它是如何工作的?我们匹配XX,然后我们尽可能多地使用非!,非#个字符。下一组(?:![^#]#[^!#]*)!匹配,然后消费所有内容直至下一个#,并继续使用非#,非!。必要时会多次重复此部分,直到我们找到#前面没有!