簡體   English   中英

正則表達式模式匹配,不包括案例列表

[英]regular expression pattern match excluding a list of cases

我想匹配街道名稱模式,該模式由幾個大寫字母組成,不包括某些情況,但我不知道該怎么做。

模式是“([AZ] [az] + {1,3})”(假設街道名稱由1-3個單詞組成),短版本阻止列表為[“Apt”,“West”, “東”表示方向或房間號。

列表中的任何單詞(例如“West”)都不應該在匹配結果中。 以阻止列表中的那些詞開頭的詞(例如“Westmoreland”)應該在結果中。 我怎么寫這個正則表達式?

你可以用

\b(?!(?:Apt|West|East)\b)[A-Z][a-z]+(?: (?!(?:Apt|West|East)\b)[A-Z][a-z]+){0,2}

請參閱正則表達式演示

我做了什么:

  • 修正你的正則表達式實際匹配1到3個單詞: [AZ][az]+(?: [AZ][az]+){0,2}
  • 添加了否定前瞻以限制[AZ][az]+部分匹配的值。

表達細節

  • \\b(?!(?:Apt|West|East)\\b)[AZ][az]+ - 大寫ASCII字母( [AZ] )后跟1 + ASCII小寫字母( [az]但我想你可以也可以使用[a-zA-Z]+[a-zA-Z]*這里)不是整個單詞AptWestEast ,這可以通過錨定在\\b字邊界的負前瞻來實現。 第一個\\b是一個前導詞邊界,然后負向前瞻確保在詞邊界之后,在尾隨\\b詞邊界之前沒有AptWestEast (確保整個單詞匹配)
  • (?: (?!(?:Apt|West|East)\\b)[AZ][az]+){0,2} - 0到2次出現:
    • - 空間
    • (?!(?:Apt|West|East)\\b)[AZ][az]+ - 見上文。 你不需要這里的前導詞邊界,因為AptWestEast只能出現在這里的空格之后,這是一個非單詞char。

很多人會發布一個更短的解決方案

(?: ?\b(?!(?:Apt|West|East)\b)[A-Z][a-z]+){1,3}

演示

但是,開始時的可選空間也會匹配此前導空間。 更重要的是,正則表達式現在不能線性匹配,這會影響性能。 使用小字符串,沒關系,但仍然是不好的做法。

暫無
暫無

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

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