[英]Combine two JavaScript regular expressions into one
我正在使用director.js來匹配路由,並使用正則表達式來設置不同的參數。
需要為與正則表達式1匹配而與不正則表達式2不匹配的參數提出一個正則表達式(我知道這是不好的設計,但是出於各種原因,我不得不這樣做)
[._a-zA-Z0-9-%!\\(\\)'*]+
[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-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-%!()'*]+)
是我想要的,但是當我在應用程序中嘗試時,它不起作用,在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-%!()'*]+)
但這仍然是不正確的。
您實質上是在尋找這種模式,該模式使用否定的前瞻性來確保<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)
嘗試這個:
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
如果您需要匹配regex1而不匹配regex2,那么為什么不能檢查為,
var isTrue = regex1.test(str) && !regex2.test(str)
您可以這樣在一個正則表達式中進行操作:
^(?![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-%!()'*]+$
您要拒絕的部分位於(?! )
之間,這意味着它向前看,如果該部分匹配,則匹配失敗。
附加的^
和$
將確保在字符串的開頭到該字符串的末尾進行匹配。
您要匹配的模式放置在末尾,再加上一個$
以防止其他字符跟隨該模式。
根據您的期望,您可能希望刪除第一個$
。 如果您還想使帶有排除模式的字符串失敗,並在其后跟隨其他字符,則將其刪除。 但是,如果這樣的后綴字符使字符串可能被接受,則應保留該$
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.