【问题标题】:Regex for Name, Streetname, Cityname, etc名称、街道名称、城市名称等的正则表达式
【发布时间】:2019-04-01 02:28:31
【问题描述】:

我正在使用 asp.net mvc 和 c# 编写一个 Web 应用程序。 在表单中,用户应在不同字段中输入名称、街道名称和城市。

  1. 开始: 输入的值必须以“字母”字符开头(无论语言是英文、中文还是法文或其他任何语言。所以像 é 和中文字符等都可以。但不允许使用 *¥@#1 等字符)
  2. 中:和我说的第一个和空格相同(但不是两个空格)。
  3. 结束:这就是我开头所说的。

这是正确的:

  • A b c

  • Abcd ef

  • Abcdef

这是不正确的:

  • 1abc

  • A1 公元前

  • 1 2 3

  • a b c(开头的空格)

问题:

  • 正确的正则表达式是什么?

  • 如何设置长度?

  • 在第二种情况下,我也想允许数字 0123456789(如字符)

这就是我所拥有的:'^[a-zA-Z][a-zA-Z ][a-zA-Z]$'

谢谢

【问题讨论】:

  • 末尾的空格可以接受吗?
  • 不,只有第一个字符可接受的字符才能用于最后一个字符

标签: c# regex asp.net-mvc validation


【解决方案1】:

您想要验证仅包含字母单词并在它们之间用一个空格分隔的字符串。

你可以使用像这样的正则表达式

^\p{L}+(?: \p{L}+)*$

或者,如果允许任何空白:

^\p{L}+(?:\s\p{L}+)*$

regex demo

要使其仅匹配 3 个或更多字符的字符串,请使用

^(?=.{3})\p{L}+(?:\s\p{L}+)*$
 ^^^^^^^^

详情

  • ^ - 字符串的开头
  • (?=.{3}) = 在字符串开始后立即需要任何 3 个字符的正向前瞻
  • \p{L}+ - 1 个或多个任意 Unicode 字母
  • (?:\s\p{L}+)* - 零次或多次重复
    • \s - 任何空格
    • \p{L}+ - 1 个或多个任意 Unicode 字母
  • $ - 字符串结束

请注意,如果您需要在 ASP.NET 中使用它,请仅在 服务器 端使用此正则表达式进行验证,因为在客户端,JavaScript 正则表达式可能无法正确处理此模式.

【讨论】:

  • 您能告诉我如何确保输入的值至少为 3 个字符长吗?使用我之前使用的正则表达式,它将长度强制为 3 或更多。
  • @huckjulius 使用^(?=.{3})\p{L}+(?:\s\p{L}+)*$
  • 对不起,我不得不再问一次 :) 我希望正则表达式也接受字符等数字。
  • @huckjulius 如果只需要允许 ASCII 数字,请将所​​有 \p{L} 替换为 [\p{L}0-9],参见 demo
【解决方案2】:

你可以使用这个正则表达式:

^(?:\p{L}+ )*\p{L}+$

\p{L} 匹配“字母”类别中的所有 unicode 代码点。

正则表达式匹配 0 个或多个 \p{L}+(一个或多个字母加上一个空格),然后确保至少有一个或多个字母。

Demo

示例代码:

Console.WriteLine(Regex.IsMatch("abc def", @"^(?:\p{L}+ )*\p{L}+$"));

【讨论】:

  • 感谢您的快速回答。但这会过滤掉所有特殊字符吗?什么时候怎么做?
  • @huckjulius \p{L} 匹配字母。并且正则表达式锚定在开始和结束。
  • 您不应该将空格设为可选,否则,模式会变得非常低效,并且非常长的不匹配字符串会导致灾难性的回溯。
  • 我会在 3-256 个字符内使用它
  • @WiktorStribiżew 已编辑。不过你的还是更好:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 2011-06-28
  • 1970-01-01
  • 2014-03-02
相关资源
最近更新 更多