1

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

我想换

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

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

我做了一个jsfiddle来测试t。

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

但是我怎样才能设置以下条件:直到#if string between XXand #does not contain !

4

3 回答 3

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
于 2013-08-22T12:40:44.863 回答
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**"

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

于 2013-08-22T12:40:23.507 回答
0

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

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

它是如何工作的?我们匹配XX,然后我们尽可能多地使用非!、非#字符。下一个组(?:![^#]#[^!#]*)匹配 a !,然后消耗所有内容直到下一个#,并像以前一样继续使用 non- #, non- !。这部分根据需要重复多次,直到我们找到#前面没有的a !

于 2013-08-22T13:01:34.550 回答