簡體   English   中英

正則表達式 - 除“e”之外的任何字母

[英]Regex - any alphabet except "e"

我想為除“e”之外的任何字母創建正則表達式這就是我想出的-

/([a-d]|[f-z])+?/i
  • 上面的正則表達式與“e”不匹配,這很好。
  • 它與“amrica”匹配
  • 但它也匹配“美國”但不應該因為美國的“e”

我究竟做錯了什么?

你需要錨點^ (字符串的開頭)和$ (字符串的結尾); 否則你的模式可以部分匹配任何字符串,只要它包含e以外的字母:

/^[a-df-z]+$/i.test("america")
// false

/^[a-df-z]+$/i.test("amrica")
// true

/^[a-df-z]+$/i.test("e")
// false

您可以使用[az]字符類,但使用負前瞻 (?!e) 限制它,使用分組構造(?:...)對此模式進行分組,並在模式周圍添加錨點:

/^(?:(?!e)[a-z])+$/i

請參閱正則表達式演示

這種技術適用於支持前瞻的所有正則表達式。 注意在Java和其他一些語言中,您可以使用字符類減法 ,但JS RegExp(也不是Python re )不支持它。 例如,在Java中,您可以使用s.matches("(?i)[az&&[^e]]+")

圖案細節

  • ^ - 字符串的開頭
  • (?:(?!e)[az])+ - 來自azAZ范圍的1個或更多字符但是eE
  • $ - 字符串錨的結束
  • i - 不區分大小寫的修飾符。

JS演示:

 var rx = /^(?:(?!e)[az])+$/i; var strs = ['america','e', 'E', 'world','hello','welcome','board','know']; for (var s of strs) { console.log(s, "=>", rx.test(s)); } 

你也可以在reg中添加資本使用:

^[a-df-zA-DF-Z]+$

i.test("America")
// false

i.test("Amrica")
// true

i.test("e")   or  i.test("E") 
// false

請參考許多在線網站,逐步學習正則表達式創建https://regex101.com

另外幾個答案是:

  1. 使用前瞻:

     /^((?=[az])[^e])+$/i 

這首先檢查下一個字符是否為字母, 然后檢查它不是e (或E )。

這是JavaScript中的有效正則表達式語法,但其性能低於接受的答案。

  1. 使用set intersection:

     /^[[az]&&[^e]]+$/i 

這是“ az ”和“not e ”的集合交集中的匹配字符。

不是JavaScript中的有效語法 但是,它與公認的答案同樣具有高效性。 它只是各種其他正則表達式“風格”中的有效語法,如Java,Perl,PHP,Python和Ruby。

  1. 使用set減法:

     /^[[az]--[e]]+$/i 

這是“ az ”和e集合減法中的匹配字符。

不是JavaScript中的有效語法 但是,它與公認的答案同樣具有高效性。 它只是Python和.Net等各種其他正則表達“風格”中的有效語法。 (語法也略有不同,例如- vs -- 。)

為什么不遍歷單詞中的每個字符?

 [i for i in strs if 'e' not in i]

暫無
暫無

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

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