我正在使用director.js来匹配路由,并使用正则表达式来表示不同的参数。
需要为匹配正则表达式1的参数提供正则表达式而不匹配正则表达式2(我知道它的设计很糟糕但是我必须这样做的原因有各种各样的原因)
.so
[._a-zA-Z0-9-%!\(\)'*]+
这样做的最佳方式是什么?
感谢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-%!()'*]+)
但这仍然不正确。
答案 0 :(得分:1)
您实际上是在寻找这种模式,它使用否定前瞻来确保<first>
的匹配不匹配<second>
:
/(?! <second> )(?: <first> )/
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;
答案 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-%!()'*]+$
您要拒绝的部分首先出现在(?! )
之间,这意味着它会向前看并且如果该部分匹配则会使匹配失败。
额外的^
和$
将确保匹配在字符串的开头处完成,直到该字符串的最后。
您想要匹配的模式放在最后,再添加一个$
以防止其他字符遵循该模式。
根据您的期望,您可能希望删除第一个$
。如果您还希望将具有排除模式的字符串与其后的其他字符一起失败,请将其删除。但是,如果这样的后缀字符使字符串可能被接受,则应保留$
。