亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

正則表達式:如何在復合表達式中獲得AND THEN運算符的作用?

正則表達式:如何在復合表達式中獲得AND THEN運算符的作用?

慕妹3146593 2021-04-15 17:14:31
我正在努力使用正則表達式。我想我了解個人的表達方式,但將某些內容組合在一起完全使我感到困惑。我不了解如何使用與AND運算符等效的東西來將我想要的片段連接成一個“完整”的匹配表達式。例如,我想將一個字符串拆分為一個數組,以中斷<1>to<57>和</1>to的任何值</57>。所以,我以為我需要這樣的東西:( '<' or '<\/' ) and ( [1-9] or [1-4][0-9] or [5][0-7] ) and '>'我可以單獨使用<[1-4] [0-9]>或</ [1-4] [0-9]>,但是當與'|'一起使用時 它返回部分匹配項或在完全匹配項之間未定義。你能告訴我我不明白的事嗎?附件是我的例子。如果對第一個表達式單擊“嘗試”,它將在每個<21>或之后產生空值</21>。測試時,它在console.log中打印為未定義。第二個表達式在每個標簽之后產生<和</。我不明白這一點,更不用說如何在此問題的前面將更完整的表達式轉換為regExp了。所需的輸出是:'This is a', '<21>', 'test', '<\/21>', '.'謝謝你。補充 在收到Georg對這個問題的回答后,我開始對轉義這些標簽的方法感興趣,特別是因為當前僅在Chrome中不支持負向回溯。通過這種方式,我的意思是\<21>將被視為常規文本,并且此時不會生成字符串拆分。如果你有興趣在類似的東西,你可能會找到答案由雷沃提供我的后續問題在這里非常有用。let b, B = document.querySelectorAll('button');for ( b of B ) b.addEventListener( 'click', split_str, false );function split_str( evt ) {   let e = evt.currentTarget,       r = new RegExp( e.previousElementSibling.value ),       s = e.parentNode.previousElementSibling.value;   e.parentNode.lastElementChild.textContent = s.split(r);    }div > div  { border: 1px solid rgb(150,150,150); width: 500px; height: 200px;padding: 5px; }input { border: 1px solid rgb(150,150,150); width: 500px; margin-bottom: 20px; padding:5px; }<input type='text' value="This is a<21>test</21>."><div><input type='text' value="(<[1-4][0-9]>)|(<\/[1-4][0-9]>)"> <button>try</button><input type='text' value="((<|<\/)[1-4][0-9]>)"> <button>try</button><div></div></div> 
查看完整描述

3 回答

?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

好的,讓我們從thingy開始。很好,但從技術上講,無需在單個括號中加上一個符號[5]

 [1-9] | [1-4][0-9] | 5[0-7]

(為清楚起見,請在此處和下方使用空格)。

對于第一部分,使用a | ab時,像這樣的更改讀起來更好ab?,即“ a,然后可選地是b`”。這給了我們

 < \/ ?

現在,您要查找的“ and”(或“ and then”)運算符在正則表達式語言中非常簡單-沒什么。也就是說,a and then b就是ab

但是,如果我們像這樣簡單地將兩個部分組合在一起

a  x | y | z

這將是一個錯誤,因為|優先級較低,因此應解釋為

ax | y | z

這不是我們想要的。因此,我們需要將數字事物放入parens中,由于下面將要解釋的原因,這些parens也必須是不可捕獲的:

<\/?  (?: [1-9] | [1-4][0-9] | 5[0-7] )

這與我們的定界符匹配,但是我們還需要介于兩者之間的所有內容,因此我們將繼續進行split輸入。split通常返回與分隔符不匹配的字符串數組:

"a,b,c".split(/,/) => a b c

如果我們也想包含定界符,則必須將其放置在捕獲組中:

"a,b,c".split(/(,)/) => a , b , c

因此,我們必須再次將所有內容包裝在括號中:

(  <\/?  (?: [1-9] | [1-4][0-9] | 5[0-7] )  )

這就是原因?:-我們希望捕獲全部內容,而不是數量部分。

將所有內容放在一起似乎可以解決問題:


s = "This is a<21>test</21>."   
console.log(s.split(/(<\/?(?:[1-9]|[1-4][0-9]|5[0-7])>)/))


查看完整回答
反對 回復 2021-04-29
?
慕田峪4524236

TA貢獻1875條經驗 獲得超5個贊


你差不多了。這真的很簡單,就像用連接替換'or'或用串聯|替換一樣and。然后,通過?:在每個組的開頭添加以下內容,確保您的組不匹配:


(?:<|<\/)(?:[1-9]|[1-4][0-9]|[5][0-7])>


MDN對split和正則表達式的交互進行了解釋。但是,簡短的示例解釋是:


'hi_joe'.split('_'); // ['hi', 'joe']

'hi_joe'.split(/_/); // ['hi', 'joe']

'hi_joe'.split(/(_)/); // ['hi', '_', 'joe']

'hi_joe'.split(/(?:_)/); // ['hi', 'joe']

根據評論更新,如果您還希望在結果數組中使用<##>,則將正則表達式包裝在另一組括號中。


((?:<|<\/)(?:[1-9]|[1-4][0-9]|[5][0-7])>)


查看完整回答
反對 回復 2021-04-29
  • 3 回答
  • 0 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號