我需要一个正则表达式验证城市文本框,城市文本框字段只接受字母,空格和破折号( - )。
答案 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)
^[a-zA-Z\- ]+$
这也许有用http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
答案 5 :(得分:1)
使用此正则表达式:
^[a-zA-Z-\s]+$
答案 6 :(得分:1)
经过几个小时的寻找城市正则表达式匹配器,我已经建立了这个并且它满足了我的需求100%
(?ix)^[A-Z.-]+(?:\s+[A-Z.-]+)*$
用于测试城市的表达式。 匹配
似乎有很多正则表达式,我根据我的Java需求构建了它并且它运行良好
答案 7 :(得分:1)
^[a-zA-Z.-]+(?:[\s-][\/a-zA-Z.]+)*$
这将有助于识别一些城市名称,例如圣约翰,圣安妮,大沙鲁特/大瀑布城
答案 8 :(得分:0)
你可以试试这个:
^\p{L}+(?:[\s\-]\p{L}+)*
上述正则表达式将:
答案 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)
以下是一些有趣的极端情况:
因此,不要忘记添加'
和0-9
作为城市名称的可能首字母。