Regex 带撇号的城市正则表达式

Regex 带撇号的城市正则表达式,regex,validation,Regex,Validation,这是我的javascript正则表达式,用于城市名称,它几乎处理除此之外的所有情况 ^[a-zA-Z]+[\. - ']?(?:[\s-][a-zA-Z]+)*$ (应该通过) 阿莱纳学院 三滩谷 圣托马斯 圣托马斯·文森特 圣托马斯·文森特 圣托马斯·文森特 圣托马斯 水蟒鹿洛奇县酒店 (如果失败) 桑。棕褐色的山谷 圣。。托马斯 圣。。托马斯,文森特 圣托马斯-文森特 圣托马斯 我认为以下regexp符合您的要求: ^([Ss]t\. |[a-zA-Z ]|\['-](?:[^-']

这是我的javascript正则表达式,用于城市名称,它几乎处理除此之外的所有情况

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

  • 阿莱纳学院
  • 三滩谷
  • 圣托马斯
  • 圣托马斯·文森特
  • 圣托马斯·文森特
  • 圣托马斯·文森特
  • 圣托马斯
  • 水蟒鹿洛奇县酒店
(如果失败)

  • 桑。棕褐色的山谷
  • 圣。。托马斯
  • 圣。。托马斯,文森特
  • 圣托马斯-文森特
  • 圣托马斯

    • 我认为以下regexp符合您的要求:

      ^([Ss]t\. |[a-zA-Z ]|\['-](?:[^-']))+$
      
      另一方面,您可能会质疑使用regexp来实现这一点的想法。。。不管您的regexp有多复杂,总会有一些傻瓜找到一个新的不需要的模式来匹配


      通常,当您需要有效的城市名称时,最好使用一些地理编码api,如

      ,它匹配第一个列表中的所有名称,而不是第二个列表中的名称:

      /^[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
      
      试试这个正则表达式:

      ^(?:[a-zA-Z]+(?:[.'\-,])?\s?)+$
      
      这不符合:

      阿莱尼学院
      新滩谷
      圣托马斯
      圣托马斯·文森特
      圣托马斯·文森特
      圣托马斯·文森特
      圣托马斯
      水蟒鹿洛奇县
      圣托马斯山
      存储区域网络。棕褐色的山谷
      华盛顿特区

      但不匹配:

      圣。。托马斯
      圣。。托马斯--文森特
      圣托马斯-文森特
      圣托马斯

      (我允许它匹配
      San.Tan.Valley
      ,因为可能有一个城市名有两个句号。)

      正则表达式的工作原理:

      # ^         - 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
      

      你能稍微澄清一下匹配标准吗?为什么要
      San。棕褐色的山谷
      失败?@willOEM,因为我不知道一个城市有两个句号。好的,但从外面看,我们不知道你想要匹配的内容的上下文。我可以想象,如果您试图解析外部来源或用户提供的内容,
      San。棕褐色的Valley
      可以接受,因为它在语法上没有错误。只要我的两分钱。我为我的项目设置了通过和失败所需的要求。这就是我对正则表达式的建模。圣托马斯山的
      Monte St.Thomas也失败了,没有一个带破折号的通过?我使用的是无法使其匹配任何内容(将你的正则表达式粘贴到其中,当我尝试将其与其中的正则表达式链接时,此url会断开。)除非我做错了什么,否则它不会使用,我忘记了单词字符后面的一些量词:-/现在应该适用于您问题中的所有情况。但是,
      圣托马斯山
      失败。另外,请你解释一下正则表达式好吗?@Cerbrus:那不在你的列表中。我以为你只想在第一个单词后面加上点?如果你想在任何地方都允许它,但只允许它一次(如其他评论中所述),它会变得复杂得多。我最终不允许使用分隔符。这也匹配了
      Yan'St-
      @Bergi:
      华盛顿特区。
      好吧,我想我们总能找到其他角色不匹配的位置……是的,这样的军备竞赛没有结束:p这让我离得够近了,因为总会有那个,谢谢你的解释。