[英]Insure that regex moves to the second OR element only if the first one doesn't exist
我想在一個字符串匹配某個單詞且僅當不存在我想用或匹配的另外一個它|
運營商....但是比賽忽略了......我怎樣才能確保行為有效:
const str = 'Soraka is an ambulance 911' const regex = RegExp('('+'911'+'|'+'soraka'+')','i') console.log(str.match(regex)[0]) // should get 911 instead
911
發生在字符串的后期,而Soraka
發生得更早,而正則表達式引擎逐個字符地迭代,因此Soraka
首先匹配,即使它位於交替的右側。
一種選擇是在捕獲的前瞻中匹配Soraka
或911
,然后使用正則表達式匹配對象,在兩個組之間交替以獲得undefined
那個:
const check = (str) => { const regex = /^(?=.*(911)|.*(Soraka))/; const match = str.match(regex); console.log(match[1] || match[2]); }; check('Soraka is an ambulance 911'); check('foo 911'); check('foo Soraka');
您可以使用includes
和find
find
找到的任何字符串返回的字符串回原始的字符串, const str = 'Soraka is an ambulance 911' const findStr = (...arg) => { return [...arg].find(toCheck => str.includes(toCheck)) } console.log(findStr("911", "Soraka"))
如果您希望匹配不區分大小寫,則可以擴展findStr
const str = 'Soraka is an ambulance 911' const findStr = (...arg) => { return [...arg].find(toCheck => str.toLowerCase().includes(toCheck.toLowerCase())) } console.log(findStr("Soraka", "911"))
如果你想匹配整個單詞而不是部分單詞,那么你可以構建動態正則表達式並使用它搜索值
const str = '911234 Soraka is an ambulance 911' const findStr = (...arg) => { return [...arg].find(toCheck =>{ let regex = new RegExp(`\\\\b${toCheck}\\\\b`,'i') return regex.test(str) }) } console.log(findStr("911", "Soraka"))
只需在匹配911
或Soraka
的捕獲組之前使用貪婪的點:
/.*(911)|(Soraka)/
請參閱正則表達式演示
.*
(或者,如果有換行符, /.*(911)|(Soraka)/s
在Chrome / Node中使用/.*(911)|(Soraka)/s
,或/[^]*(911)|(Soraka)/
以支持舊版EMCMScript版本) 當匹配911
或Soraka
時,將確保正則表達式索引前進到最右邊的位置 。
JS演示(借鑒@CertainPerformance的答案):
const check = (str) => { const regex = /.*(911)|(Soraka)/; const match = str.match(regex) || ["","NO MATCH","NO MATCH"]; console.log(match[1] || match[2]); }; check('Soraka is an ambulance 911'); check('Ambulance 911, Soraka'); check('foo 911'); check('foo Soraka'); check('foo oops!');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.