名称、街道名称、城市名称等的正则表达式

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 已编辑。不过你的还是更好:)

以上是关于名称、街道名称、城市名称等的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

在 Bigquery 中使用正则表达式获取地址的街道名称和编号

用于提取要匹配的某些部分的正则表达式

行没有被正则表达式捕获

来自名称的正则表达式特定词[关闭]

正则表达式 如何完成匹配某个字符串 但是不包含指定字符串

js 正则表达式 验证公司名称 请高手写下?谢谢!