我是正则表达式的新手,你能帮我解决这个问题吗?
我想替换
一些文字和XXblaaaaa#和文字再次XXbl!abla#或XXblalala#或XXbabla#
与
一些文字和OOTEXT **和文字再次OOTEXT **或OOTEXT **
我测试的正则表达式为:/((XX).+?(?=(#)))/g;
,即找到XX
直到#
。
但是如何设置以下条件:如果#
和XX
之间的字符串不包含#
,请直到!
?
答案 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
,然后我们尽可能多地使用非!
,非#
个字符。下一组(?:![^#]#[^!#]*)
与!
匹配,然后消费所有内容直至下一个#
,并继续使用非#
,非!
。必要时会多次重复此部分,直到我们找到#
前面没有!
。