名称、街道名称、城市名称等的正则表达式
Posted
技术标签:
【中文标题】名称、街道名称、城市名称等的正则表达式【英文标题】:Regex for Name, Streetname, Cityname, etc 【发布时间】:2019-04-01 02:28:31 【问题描述】:我正在使用 asp.net mvc 和 c# 编写一个 Web 应用程序。 在表单中,用户应在不同字段中输入名称、街道名称和城市。
-
开始: 输入的值必须以“字母”字符开头(无论语言是英文、中文还是法文或其他任何语言。所以像 é 和中文字符等都可以。但不允许使用 *¥@#1 等字符)
中:和我说的第一个和空格相同(但不是两个空格)。
结束:这就是我开头所说的。
这是正确的:
A b c
Abcd ef
Abcdef
这是不正确的:
1abc
A1 公元前
1 2 3
a b c(开头的空格)
问题:
正确的正则表达式是什么?
如何设置长度?
在第二种情况下,我也想允许数字 0123456789(如字符)
这就是我所拥有的:'^[a-zA-Z][a-zA-Z ][a-zA-Z]$'
谢谢
【问题讨论】:
末尾的空格可以接受吗? 不,只有第一个字符可接受的字符才能用于最后一个字符 【参考方案1】:您想要验证仅包含字母单词并在它们之间用一个空格分隔的字符串。
你可以使用像这样的正则表达式
^\pL+(?: \pL+)*$
或者,如果允许任何空白:
^\pL+(?:\s\pL+)*$
见regex demo
要使其仅匹配 3 个或更多字符的字符串,请使用
^(?=.3)\pL+(?:\s\pL+)*$
^^^^^^^^
详情
^
- 字符串的开头
(?=.3)
= 在字符串开始后立即需要任何 3 个字符的正向前瞻
\pL+
- 1 个或多个任意 Unicode 字母
(?:\s\pL+)*
- 零次或多次重复
\s
- 任何空格
\pL+
- 1 个或多个任意 Unicode 字母
$
- 字符串结束
请注意,如果您需要在 ASP.NET 中使用它,请仅在 服务器 端使用此正则表达式进行验证,因为在客户端,javascript 正则表达式可能无法正确处理此模式.
【讨论】:
您能告诉我如何确保输入的值至少为 3 个字符长吗?使用我之前使用的正则表达式,它将长度强制为 3 或更多。 @huckjulius 使用^(?=.3)\pL+(?:\s\pL+)*$
对不起,我不得不再问一次 :) 我希望正则表达式也接受字符等数字。
@huckjulius 如果只需要允许 ASCII 数字,请将所有 \pL
替换为 [\pL0-9]
,参见 demo。【参考方案2】:
你可以使用这个正则表达式:
^(?:\pL+ )*\pL+$
\pL
匹配“字母”类别中的所有 unicode 代码点。
正则表达式匹配 0 个或多个 \pL+
(一个或多个字母加上一个空格),然后确保至少有一个或多个字母。
Demo
示例代码:
Console.WriteLine(Regex.IsMatch("abc def", @"^(?:\pL+ )*\pL+$"));
【讨论】:
感谢您的快速回答。但这会过滤掉所有特殊字符吗?什么时候怎么做? @huckjulius\pL
仅匹配字母。并且正则表达式锚定在开始和结束。
您不应该将空格设为可选,否则,模式会变得非常低效,并且非常长的不匹配字符串会导致灾难性的回溯。
我会在 3-256 个字符内使用它
@WiktorStribiżew 已编辑。不过你的还是更好:)以上是关于名称、街道名称、城市名称等的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章