除非用[nocode] [/ nocode]标记包装,否则JavaScript RegEx匹配

时间:2015-03-07 21:11:29

标签: javascript regex regex-negation

我目前的代码是:

var user_pattern = this.settings.tag;
user_pattern = user_pattern.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); // escape regex
var pattern = new RegExp(user_pattern.replace(/%USERNAME%/i, "(\\S+)"), "ig");

其中this.settings.tag是一个字符串,例如" [user =%USERNAME%]"或" @%USERNAME%"。该代码使用pattern.exec(str)来查找相应标记中的任何用户名,并且工作正常。例如,如果str = "Hello, [user=test]",则pattern.exec(str)会找到test

这样可以正常工作,但如果字符串包含在[nocode][/nocode]标记中,我希望能够阻止匹配。例如,如果str = "[nocode]Hello, [user=test], how are you?[/nocode]" then pattern.exec(str)`不匹配任何内容。

我不太清楚从哪里开始。我尝试在模式之前和之后使用(?![nocode]),但无济于事。任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

在尝试查找用户名之前,可能会过滤掉[nocode]

pattern.exec(str.replace(/\[nocode\](.*)\[\/nocode\]/g,''));

我知道这并不是你所要求的,因为现在你必须使用两个独立的正则表达式,但是代码可读性也很重要,这样做在这方面肯定更好。希望这有帮助

JSFiddle:http://jsfiddle.net/1f485Lda/1/

基于此:Regular Expression to get a string between two strings in Javascript

答案 1 :(得分:0)

我只是测试字符串是否首先以[nocode]开头:

/^\[nocode\]/.test('[nocode]');

然后根本不处理它。