将两个JavaScript正则表达式合并为一个

时间:2017-03-02 19:53:39

标签: javascript regex

背景:

我正在使用director.js来匹配路由,并使用正则表达式来表示不同的参数。

问题:

需要为匹配正则表达式1的参数提供正则表达式而不匹配正则表达式2(我知道它的设计很糟糕但是我必须这样做的原因有各种各样的原因)

  1. .so
  2. [._a-zA-Z0-9-%!\(\)'*]+
  3. 这样做的最佳方式是什么?

    更新

    感谢gyre。我认为[a-z0-9][a-zA-Z0-9]{3}(0[a-zA-Z0-9]{2}|[a-zA-Z0-9]00)[a-zA-Z0-9]{8}([a-zA-Z0-9]{3})?类似于我想要的东西,但是当我在我的应用程序中尝试使用https://regex101.com/中的这个正则表达式时它仍然无效 - 它仍然可以找到字符串“00Bxx0000025e1UEA”的匹配项 - - > Bxx0000025e1UEA,我觉得图书馆有点混淆了。反正有没有更新正则表达式找不到“00Bxx0000025e1UEA”的匹配?

    我试图为正则表达式添加^和$: (?![a-z0-9][a-zA-Z0-9]{3}(0[a-zA-Z0-9]{2}|[a-zA-Z0-9]00)[a-zA-Z0-9]{8}([a-zA-Z0-9]{3})?)(?:[._a-zA-Z0-9-%!()'*]+)但这仍然不正确。

4 个答案:

答案 0 :(得分:1)

您实际上是在寻找这种模式,它使用否定前瞻来确保<first>的匹配不匹配<second>

/(?! <second> )(?: <first> )/

&#13;
&#13;
var first = /[._a-zA-Z0-9-%!()'*]+/
var second = /[a-z0-9][a-zA-Z0-9]{3}(0[a-zA-Z0-9]{2}|[a-zA-Z0-9]00)[a-zA-Z0-9]{8}([a-zA-Z0-9]{3})?/

var third = new RegExp('(?!' + second.source + ')(?:' + first.source + ')')

console.log(third)
&#13;
&#13;
&#13;

答案 1 :(得分:0)

试试这个:

var str = "the string to test"
var re1 = "your first regex, [._a-zA-Z0-9-%!()'*]+"
var re2 = "your second regex, [a-z0-9][a-zA-Z0-9]{3}(0[a-zA-Z0-9]{2}|[a-zA-Z0-9]00)[a-zA-Z0-9]{8}([a-zA-Z0-9]{3})?"

if(str.search(re1) != -1 && str.search(r2) == -1) {
    // your action
}
如果没有匹配,

search将返回-1

答案 2 :(得分:0)

如果您需要匹配regex1而不匹配regex2,那么为什么不能检查为,

var isTrue = regex1.test(str) && !regex2.test(str)

答案 3 :(得分:0)

你可以在一个正则表达式中这样做:

^(?![a-z0-9][a-zA-Z0-9]{3}(0[a-zA-Z0-9]{2}|[a-zA-Z0-9]00)[a-zA-Z0-9]{8}([a-zA-Z0-9]{3})?$)[._a-zA-Z0-9-%!()'*]+$

您要拒绝的部分首先出现在(?! )之间,这意味着它会向前看并且如果该部分匹配则会使匹配失败。

额外的^$将确保匹配在字符串的开头处完成,直到该字符串的最后。

您想要匹配的模式放在最后,再添加一个$以防止其他字符遵循该模式。

regex101.com

上查看

根据您的期望,您可能希望删除第一个$。如果您还希望将具有排除模式的字符串与其后的其他字符一起失败,请将其删除。但是,如果这样的后缀字符使字符串可能被接受,则应保留$