簡體   English   中英

將兩個JavaScript正則表達式合並為一個

[英]Combine two JavaScript regular expressions into one

背景:

我正在使用director.js來匹配路由,並使用正則表達式來設置不同的參數。

問題:

需要為與正則表達式1匹配而與不正則表達式2不匹配的參數提出一個正則表達式(我知道這是不好的設計,但是出於各種原因,我不得不這樣做)

  1. [._a-zA-Z0-9-%!\\(\\)'*]+
  2. [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-%!()'*]+$

您要拒絕的部分位於(?! )之間,這意味着它向前看,如果該部分匹配,則匹配失敗。

附加的^$將確保在字符串的開頭到該字符串的末尾進行匹配。

您要匹配的模式放置在末尾,再加上一個$以防止其他字符跟隨該模式。

regex101.com查看

根據您的期望,您可能希望刪除第一個$ 如果您還想使帶有排除模式的字符串失敗,並在其后跟隨其他字符,則將其刪除。 但是,如果這樣的后綴字符使字符串可能被接受,則應保留該$

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM