2013-08-22 32 views
1

我是新的正则表达式,你能帮我解决这个问题吗?Javascript正则表达式难以取代

我想更换

一些文字和XXblaaaaa#和文本再次XXbl!阿夫拉#或XXblalala#或XXbabla#

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

I made a jsfiddle to test t.

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

但我怎么可以设置以下条件:直到#如果XX#之间串不包含!

+0

为什么'XXbl!abla#或'从字符串中消失了? –

+0

啊,现在我明白了。对于每个'!',你想忽略下一个'#',而不是跳过整个'XX ..!#'的东西。 –

+0

对不起,一个开放的新问题http:// stackoverflow。com/questions/18382328/regex-to-detect-urls-with-character-end-ended – Dmitry

回答

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**" 

我不知道,如果你的例子是真的就这么简单,所以上面是一个很大的灵活性的方法。你也可以使用[^!]*?来代替.*?,但任何更复杂的单个角色都需要更加精细。

+0

它确实具有超前性。 –

+0

@ m.buettner:的确,我认为当时是在考虑后视。有一个有,一个没有,但永远不会记得。 ;-) –

+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 
+0

为什么不把'#'放在字符类里面去摆脱这种不正当性呢? –

+1

我认为这种方式更容易理解,因为它看起来更像OP的描述。 “从XX到#不包括'!'” – ColBeseder

+0

当然,但这并不意味着我们不应该提倡最佳实践;)。 –

0

我想你想要的是这样的:

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

它是如何工作的?我们匹配XX,然后我们尽可能多地使用非!,非#字符。下一个组(?:![^#]#[^!#]*)匹配!,然后消耗一切,直到下一个#并继续与非#!一样。根据需要重复该部分多次,直到我们发现#之前没有!