城市名称的正则表达式

时间:2012-08-01 10:08:29

标签: regex city

我需要一个正则表达式验证城市文本框,城市文本框字段只接受字母,空格和破折号( - )。

13 个答案:

答案 0 :(得分:24)

这个答案假定@Manaysah所指的字母也包含使用变音符号。我添加了单引号'因为加拿大和法国的许多名字都有它。我还添加了期限(点),因为它是签约名称所必需的。

在@UIDs的基础上回答我的想法,

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

它接受的城市列表:

Toronto
St. Catharines
San Fransisco
Val-d'Or
Presqu'ile
Niagara on the Lake
Niagara-on-the-Lake
München
toronto
toRonTo
villes du Québec
Provence-Alpes-Côte d'Azur
Île-de-France
Kópavogur
Garðabær
Sauðárkrókur
Þorlákshöfn

它拒绝的是什么:

A----B
------
*******
&&
()
//
\\

我没有添加使用括号和其他标记,因为它不属于这个问题的范围。

我因为空白而离开了\ s。标签和换行符不是城市名称的一部分,在我看来不应该使用。

答案 1 :(得分:19)

这可能是任意复杂的,取决于您需要匹配的精确程度,以及您愿意允许的变化。

^[a-zA-Z]+(?:[\s-][a-zA-Z]+)*$这样简单的事情应该有效。

警告:这与München等城市不匹配,但在这里你基本上需要使用表达式的[a-zA-Z]部分,并定义允许哪些字符你的具体情况。

请记住,它还允许使用San ---- Francisco,或者有几个空格。

转换为: 一个或多个字母,后跟一个块:0或更多空格或破折号和更多字母,最后一个块可以出现0次或更多次。

那里有奇怪的东西:?:位。如果你不熟悉正则表达式,它可能会让人感到困惑,但这只是表明括号之间的正则表达式不是捕获组(我不想捕获它匹配的部分以便以后重用),所以括号仅用于对表达式进行分组(而不是捕获匹配)。

"New York" // passes

"San-Francisco" // passes

"San Fran Cisco" // passes (sorry, needed an example with three tokens)

"Chicago" // passes

"  Chicago" // doesn't pass, starts with spaces

"San-" // doesn't pass, ends with a dash

答案 2 :(得分:5)

如果有人在搜索城市名称的正则表达式时需要它,请添加我的答案,就像我做的那样

请使用此:

^[a-zA-Z\u0080-\u024F\s\/\-\)\(\`\.\"\']+$

许多城市名称包含破折号,例如 Soddy-Daisy,田纳西州,或者加利福尼亚州LaCañadaFlintridge的中的特殊字符

希望这有帮助!

答案 3 :(得分:3)

这是我发现效果最好的那个

for PCRE flavors允许\p{L}(.NET,php,Golang)

/^\p{L}+(?:([\ \-\']|(\.\ ))\p{L}+)*$/u

不允许\p{L}的正则表达式将其替换为[a-zA-Z\u0080-\u024F]

所以对于javascript,使用python正则表达式

/^[a-zA-Z\u0080-\u024F]+(?:([\ \-\']|(\.\ ))[a-zA-Z\u0080-\u024F]+)*$/

白色列出一堆字符很容易,但在正则表达式中有一些注意事项

  • 不应允许连续的非字母字符。即Los Angeles失败,因为它有两个空格
  • 期间之后应该有空格。即St.Albert失败,因为它错过了空间
  • 名称不能以非字母字符开头或结尾,即-Chicago-失败
  • 空白字符\s!== \,即标签和换行符可以通过,因此应该定义空格字符

注意:在构建正则表达式规则时,我发现https://regex101.com/tests非常有用,因为您可以轻松创建单元测试

js:https://regex101.com/r/cgJwc0/1/tests
php:https://regex101.com/r/Yo3GV2/1/tests

答案 4 :(得分:1)

答案 5 :(得分:1)

使用此正则表达式:

^[a-zA-Z-\s]+$

答案 6 :(得分:1)

经过几个小时的寻找城市正则表达式匹配器,我已经建立了这个并且它满足了我的需求100%

(?ix)^[A-Z.-]+(?:\s+[A-Z.-]+)*$
用于测试城市的

表达式。 匹配

  • 城市
  • ST。城市
  • Some Silly-City
  • City St.
  • 太多单词之城

似乎有很多正则表达式,我根据我的Java需求构建了它并且它运行良好

答案 7 :(得分:1)

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

这将有助于识别一些城市名称,例如圣约翰,圣安妮,大沙鲁特/大瀑布城

答案 8 :(得分:0)

你可以试试这个:

^\p{L}+(?:[\s\-]\p{L}+)*

上述正则表达式将:

  • 限制前导和尾随空格,连字符
  • 匹配名称为Néewiller-près-lauterbourg
  • 的城市

答案 9 :(得分:0)

我喜欢shepley的建议,但它有一些缺陷。

如果你改变shpeley的正则表达式,它将不接受其他特殊字符:

^([a-zA-Z \ u0080- \ u024F] {1} [a-zA-Z \ u0080- \ u024F \。| \ - | |'] * [a-zA-Z \ u0080- \ u024F \。'] {1})$

答案 10 :(得分:0)

我用那个:

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

答案 11 :(得分:0)

以下是适用于大多数城市的产品,并且已经过测试:

^[a-zA-Z\u0080-\u024F]+(?:. |-| |')*([1-9a-zA-Z\u0080-\u024F]+(?:. |-| |'))*[a-zA-Z\u0080-\u024F]*$

下面的Python代码,包括其测试。

import re
import pytest


CITY_RE = re.compile(
    r"^[a-zA-Z\u0080-\u024F]+(?:. |-| |')*"  # a word
    r"([1-9a-zA-Z\u0080-\u024F]+(?:. |-| |'))*"
    r"[a-zA-Z\u0080-\u024F]*$"
)


def is_city(value: str) -> bool:
    valid = CITY_RE.match(value) is not None
    return valid

# Tests
@pytest.mark.parametrize(
    "value,expected",
    (
        ("1", False),
        ("Toronto", True),
        ("Saint-Père-en-Retz", True),
        ("Saint Père en Retz", True),
        ("Saint-Père en Retz", True),
        ("Paris 13e Arrondissement", True),
        ("Paris  13e  Arrondissement ", True),
        ("Bouc-Étourdi", True),
        ("Arnac-la-Poste", True),
        ("Bourré", True),
        ("Å", True),
        ("San Francisco", True),
    ),
)
def test_is_city(value, expected):
    valid, msg = validate.is_city(value)
    assert valid is expected

答案 12 :(得分:0)

以下是一些有趣的极端情况:

  • 的墓地
  • 的格雷文迪尔
  • 的Gravenpolder
  • 的格雷文赞德(Gravenzande)
  • 's Heer Arendskerke
  • 的Heerenberg
  • 的Heerenhoek
  • 的Hertogenbosch
  • 不是哈德
  • 不是疯了
  • 不是赞德
  • 100英里房屋
  • 6 October City

因此,不要忘记添加'0-9作为城市名称的可能首字母。