我是新的正则表达式,你能帮我解决这个问题吗?Javascript正则表达式难以取代
我想更换
一些文字和XXblaaaaa#和文本再次XXbl!阿夫拉#或XXblalala#或XXbabla#
与
一些文字和OOTEXT * *和文本再次OOTEXT **或OOTEXT **
我的测试正则表达式是:/((XX).+?(?=(#)))/g;
,即找到XX
直到#
。
但我怎么可以设置以下条件:直到#
如果XX
和#
之间串不包含!
?
我是新的正则表达式,你能帮我解决这个问题吗?Javascript正则表达式难以取代
我想更换
一些文字和XXblaaaaa#和文本再次XXbl!阿夫拉#或XXblalala#或XXbabla#
与
一些文字和OOTEXT * *和文本再次OOTEXT **或OOTEXT **
我的测试正则表达式是:/((XX).+?(?=(#)))/g;
,即找到XX
直到#
。
但我怎么可以设置以下条件:直到#
如果XX
和#
之间串不包含!
?
您可以使用.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**"
我不知道,如果你的例子是真的就这么简单,所以上面是一个很大的灵活性的方法。你也可以使用[^!]*?
来代替.*?
,但任何更复杂的单个角色都需要更加精细。
它确实具有超前性。 –
@ m.buettner:的确,我认为当时是在考虑后视。有一个有,一个没有,但永远不会记得。 ;-) –
是的,令人费解。它不具有向后看,但它确实具有向前看。 –
/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
为什么不把'#'放在字符类里面去摆脱这种不正当性呢? –
我认为这种方式更容易理解,因为它看起来更像OP的描述。 “从XX到#不包括'!'” – ColBeseder
当然,但这并不意味着我们不应该提倡最佳实践;)。 –
我想你想要的是这样的:
result = input.replace(/XX[^!#]*(?:![^#]*#[^!#]*)*#/g, "OOTEXT**");
它是如何工作的?我们匹配XX
,然后我们尽可能多地使用非!
,非#
字符。下一个组(?:![^#]#[^!#]*)
匹配!
,然后消耗一切,直到下一个#
并继续与非#
非!
一样。根据需要重复该部分多次,直到我们发现#
之前没有!
。
为什么'XXbl!abla#或'从字符串中消失了? –
啊,现在我明白了。对于每个'!',你想忽略下一个'#',而不是跳过整个'XX ..!#'的东西。 –
对不起,一个开放的新问题http:// stackoverflow。com/questions/18382328/regex-to-detect-urls-with-character-end-ended – Dmitry