[英]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}
請參閱正則表達式演示
我做了什么:
[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]*
這里)不是整個單詞Apt
, West
或East
,這可以通過錨定在\\b
字邊界的負前瞻來實現。 第一個\\b
是一個前導詞邊界,然后負向前瞻確保在詞邊界之后,在尾隨\\b
詞邊界之前沒有Apt
, West
或East
(確保整個單詞匹配) (?: (?!(?:Apt|West|East)\\b)[AZ][az]+){0,2}
- 0到2次出現:
- 空間 (?!(?:Apt|West|East)\\b)[AZ][az]+
- 見上文。 你不需要這里的前導詞邊界,因為Apt
, West
或East
只能出現在這里的空格之后,這是一個非單詞char。 很多人會發布一個更短的解決方案
(?: ?\b(?!(?:Apt|West|East)\b)[A-Z][a-z]+){1,3}
看演示
但是,開始時的可選空間也會匹配此前導空間。 更重要的是,正則表達式現在不能線性匹配,這會影響性能。 使用小字符串,沒關系,但仍然是不好的做法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.