与撇号的城市的正则表达式

时间:2013-01-28 15:23:09

标签: regex validation

这是我的javascript正则表达式的城市名称,它除了处理几乎所有情况。

^[a-zA-Z]+[\. - ']?(?:[\s-][a-zA-Z]+)*$

(应该通过)

  • Coeur d' Alene
  • San Tan Valley
  • ST。托马斯
  • ST。托马斯文森
  • ST。托马斯文森特
  • St Thomas-Vincent
  • ST-托马斯
  • anaconda-deer lodge county

(应该失败)

  • 散。谭。谷
  • St .. Thomas
  • St .. Thomas - Vincent
  • St.-Thomas -Vincent
  • 圣 - 托马斯

3 个答案:

答案 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