【发布时间】:2012-08-01 10:08:29
【问题描述】:
我需要一个正则表达式来验证城市文本框,城市文本框字段只接受字母、空格和破折号(-)。
【问题讨论】:
-
你使用什么编程语言?
-
我试过很多次了。但我的尝试都没有成功。
我需要一个正则表达式来验证城市文本框,城市文本框字段只接受字母、空格和破折号(-)。
【问题讨论】:
此答案假定@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 的空白。制表符和换行符不是城市名称的一部分,我认为不应使用。
【讨论】:
这可以任意复杂,具体取决于您需要匹配的精确程度以及您愿意允许的变化。
像^[a-zA-Z]+(?:[\s-][a-zA-Z]+)*$ 这样相当简单的东西应该可以工作。
警告:这与慕尼黑等城市不匹配,但在这里您基本上需要使用表达式的 [a-zA-Z] 部分,并定义允许使用的字符你的特殊情况。
请记住,它还允许像 San----Francisco 之类的东西,或者有多个空格。
翻译为: 1 个或多个字母,后跟一个块: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
【讨论】:
[\s-]* 应该是 [\s-]+。除非看到实际的连字符或空白字符,否则正则表达式的该部分不应变为活动状态。
[a-zA-Z] 替换为\p{L} 这是我的版本:^\p{Lu}\p{L}*(?:[\s-]\p{Lu}\p{L}*)*$
[0-9] 怎么样?这在城镇名称中也有效。
如果有人在搜索城市名称的正则表达式时需要我的答案,就像我做的那样
请使用这个:
^[a-zA-Z\u0080-\u024F\s\/\-\)\(\`\.\"\']+$
由于许多城市名称包含破折号,例如 Soddy-Daisy, Tennessee,或特殊字符,例如 ñ in La Cañada Flintridge, California
希望这会有所帮助!
【讨论】:
这是我发现效果最好的一个
对于 PCRE 风格允许 \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
【讨论】:
这是一种适用于大多数城市的方法,并且已经过测试:
^[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
【讨论】:
^[a-zA-Z\- ]+$
这也可能有用http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
【讨论】:
München(慕尼黑)不匹配。谨慎使用时,使用\w 会有所帮助
\w 捕捉数字和_
/((?!\d|_)[\w -])+/(前瞻)
使用这个正则表达式:
^[a-zA-Z-\s]+$
【讨论】:
\s 将允许任何空格,而不仅仅是空格。
\s 好像文本框允许多行,它会将换行符解析为有效。
在寻找城市正则表达式匹配器数小时后,我构建了它,它 100% 满足我的需求
(?ix)^[A-Z.-]+(?:\s+[A-Z.-]+)*$
测试城市的表达式。 匹配
似乎有很多种正则表达式,我为我的 Java 需求构建了它,它工作得很好
【讨论】:
^[a-zA-Z.-]+(?:[\s-][\/a-zA-Z.]+)*$
这将有助于识别一些城市名称,例如 St. Johns、Baie-Sainte-Anne、Grand-Salut/Grand Falls
【讨论】:
我喜欢 shepley 的建议,但它有几个缺陷。
如果你把 shpeley 的正则表达式改成这个,它不会接受其他特殊字符:
^([a-zA-Z\u0080-\u024F]{1}[a-zA-Z\u0080-\u024F\。|\-| |']*[a-zA-Z\u0080- \u024F\.']{1})$
【讨论】:
我用那个:
^[a-zA-Z\\u0080-\\u024F.]+((?:[ -.|'])[a-zA-Z\\u0080-\\u024F]+)*$
【讨论】:
你可以试试这个:
^\p{L}+(?:[\s\-]\p{L}+)*
上述正则表达式将:
【讨论】:
\u0080-\u024F而不是\p{L}
这里有一些有趣的边缘案例:
所以,不要忘记添加' 和0-9 作为城市名称的可能第一个字符。
【讨论】: