JavaScript正则表达式匹配,除非用[nocode][/nocode]标记包装
我目前的代码是:JavaScript正则表达式匹配,除非用[nocode][/nocode]标记包装,javascript,regex,regex-negation,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.ta
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],你好吗?[/nocode]”,则pattern.exec(str)`不应匹配任何内容
我不太确定从哪里开始。我尝试在模式前后使用(?![nocode])
,但没有效果。任何帮助都会很好。在尝试查找用户名之前,可能会过滤掉[nocode]
我知道这并不是你想要的,因为现在你必须使用两个独立的正则表达式,但是代码可读性也很重要,这样做在这方面肯定更好。希望这有帮助我只需测试字符串是否首先以[nocode]开头:
/^\[nocode\]/.test('[nocode]');
那就不要处理它。我不是一个regexp专家,但是如果你单独检查[nocode],可能是indexOf(“[nocode]”]>=0或另一个regexp模式?或者它必须是一个模式吗?一个字符串可以由多个[user=]
标记组成,其中一些标记被包装在[nocode]
s不幸的是。看起来这对我的解决方案不会有问题单个字符串可能由多个[user=]
标记组成,其中一些标记包装在[nocode]
s不幸的是。我建议创建一个例程,将您的数据规范化为可预测的数据,然后继续进行解析。您可能希望使用字符串索引将字符串的各个部分提取为多个字符串等。如果您提供更多的示例,例如您在问题中提到的示例,则会更容易或者社区来帮助解决问题。这显然是向前迈出的一步。我能看到的只有一件事可能会阻止这种方法的工作,但我会尝试先绕过它,如果它不起作用,我会让你知道。我会保留最佳答案,直到那时。
/^\[nocode\]/.test('[nocode]');