我想匹配街道名称模式,该模式由几个大写字母单词组成,不包括某些情况,但我不知道该怎么做。
模式为“([AZ] [az] + {1,3})”(假设街道名称由1-3个单词组成),短版本阻止列表为[“Apt”,“ West“,”East“表示方向或房间号。
列表中的任何单词(例如“West”)都不应该在匹配结果中。以阻止列表中的那些词开头的词(例如“Westmoreland”)应该在结果中。我怎么写这个正则表达式?
答案 0 :(得分:0)
您可以使用
\b(?!(?:Apt|West|East)\b)[A-Z][a-z]+(?: (?!(?:Apt|West|East)\b)[A-Z][a-z]+){0,2}
请参阅regex demo
我做了什么:
[A-Z][a-z]+(?: [A-Z][a-z]+){0,2}
[A-Z][a-z]+
部分匹配的值。表达式详细信息:
\b(?!(?:Apt|West|East)\b)[A-Z][a-z]+
- 大写ASCII字母([A-Z]
),后跟1 + ASCII小写字母([a-z]
但我猜您也可以使用[a-zA-Z]+
或[a-zA-Z]*
这里不是一个完整的单词Apt
,West
或East
,它可以通过锚定在\b
单词边界的负前瞻来实现。第一个\b
是一个前导词边界,然后否定前瞻确保在词边界之后和尾随之前没有Apt
,West
或East
\b
字边界(确保整个单词匹配)(?: (?!(?:Apt|West|East)\b)[A-Z][a-z]+){0,2}
- 0到2次出现:
- 空格(?!(?:Apt|West|East)\b)[A-Z][a-z]+
- 见上文。由于Apt
,West
或East
只能出现在此处的空格之后,因此您不需要此处的前导字边界,这是一个非单词字符。很多人会发布更短的解决方案,比如
(?: ?\b(?!(?:Apt|West|East)\b)[A-Z][a-z]+){1,3}
请参阅demo
但是,开头的可选空间也会匹配此前导空格。更重要的是,正则表达式现在不能线性匹配,这会影响性能。使用小字符串,没关系,但仍然是不好的做法。