这是我的javascript正则表达式的城市名称,它除了处理几乎所有情况。
^[a-zA-Z]+[\. - ']?(?:[\s-][a-zA-Z]+)*$
(应该通过)
(应该失败)
答案 0 :(得分:1)
这匹配第一个列表中的所有名称,而不是第二个列表中的名称:
/^[a-zA-Z]+(?:\.(?!-))?(?:[\s-](?:[a-z]+')?[a-zA-Z]+)*$/
多行说明:
^[a-zA-Z]+ # begins with a word
(?:\.(?!-))? # maybe a dot but not followed by a dash
(?:
[\s-] # whitespace or dash
(?:[a-z]+\')? # maybe a lowercase-word and an apostrophe
[a-zA-Z]+ # word
)*$ # repeated to the end
要将点放在任何地方,而不是其中两个,请使用:
/^(?!.*?\..*?\.)[a-zA-Z]+(?:(?:\.\s?|\s|-)(?:[a-z]+')?[a-zA-Z]+)*$/
^(?!.*?\..*?\.) # does not contain two dots
[a-zA-Z]+ # a word
(?:
(?:\.\s?|\s|-) # delimiter: dot with maybe whitespace, whitespace or dash
(?:[a-z]+\')? # maybe a lowercase-word and an apostrophe
[a-zA-Z]+ # word
)*$ # repeated to the end
答案 1 :(得分:0)
我认为以下正则表达式符合您的要求:
^([Ss]t\. |[a-zA-Z ]|\['-](?:[^-']))+$
另一方面,你可能会质疑使用正则表达式做到这一点的想法......无论你的正则表达式的复杂程度如何,总会有一些傻瓜找到一个匹配的新的不需要的模式......
通常当您需要有效的城市名称时,最好使用一些地理编码API,例如google geocoding API
答案 2 :(得分:0)
试试这个正则表达式:
^(?:[a-zA-Z]+(?:[.'\-,])?\s?)+$
这匹配:
Coeur d'Alene
三潭谷
圣托马斯
圣托马斯 - 文森特 圣托马斯文森特 圣托马斯 - 文森特 圣 - 托马斯
anaconda-deer lodge county Monte St.Thomas
圣。谭。谷
华盛顿特区。
但不匹配:
圣托马斯 圣托马斯 - 文森特 圣托马斯 - 文森特 圣 - 托马斯
(我允许它匹配San. Tan. Valley
,因为可能有一个城市名称有2个句点。)
正则表达式的工作原理:
# ^ - Match the line start.
# (?: - Start a non-catching group
# [a-zA-Z]+ - That starts with 1 or more letters.
# [.'\-,]? - Followed by one period, apostrophe dash, or comma. (optional)
# \s? - Followed by a space (optional)
# )+ - End of the group, match at least one or more of the previous group.
# $ - Match the end of the line