【问题标题】:Regex for alpha number string in c# accepting underscore and white spacesc#中字母数字字符串的正则表达式接受下划线和空格
【发布时间】:2019-02-18 01:57:52
【问题描述】:

我已经浏览了很多关于 SO 的帖子。我没有找到我的特定场景所需的东西。

我需要一个用于字母数字字符串的正则表达式。 满足以下条件的地方

有效字符串:

ameya123 (alphabets and numbers)
ameya (only alphabets)
AMeya12(Capital and normal alphabets and numbers)
Ameya_123 (alphabets and underscore and numbers)
Ameya_   123 (alphabets underscore and white speces)

无效的字符串:

123 (only numbers)
_ (only underscore)
(only space) (only white spaces)
any special charecter other than underscore

到目前为止我尝试了什么:

(?=.*[a-zA-Z])(?=.*[0-9]*[\s]*[_]*)

上述正则表达式在Regex online editor 中有效,但在c# 中的数据注释中无效

请提出建议。

【问题讨论】:

  • 试试^(?!(?:\d+|_+| +)?$)[\w ]+$。在此处查看现场演示 regex101.com/r/KE96M7/1
  • ^(?!\d+$)(?![_\s]+$)[A-Za-z0-9\s_]+$ 可能也可以。验证是在服务器还是客户端或两者上执行?
  • @revo :谢谢..这对我有用..请将其作为答案移植,以便我接受并解释其工作原理:)
  • @AmeyaDeshpande 请参阅my answer,了解一些说明和替代方案。

标签: c# regex asp.net-mvc data-annotations


【解决方案1】:

根据您的要求而不是您的尝试,您需要的是:

^(?!(?:\d+|_+| +)$)[\w ]+$

否定前瞻查找不希望的匹配以使整个过程失败。这些是仅包含数字、仅下划线或仅包含空格的字符串。如果它们永远不会发生,我们希望匹配^[\w ]+$,这与^[a-zA-Z0-9_ ]+$ 几乎相同。

live demo here

解释

  • ^ 行首/字符串
  • (?! 负前瞻开始
    • (?: 非捕获组开始
      • \d+匹配数字
      • |或者
      • _+ 匹配下划线
      • |或者
      • [ ]+ 匹配空格
    • )$ 非捕获组的结尾紧跟行/字符串的结尾(应该找不到以前的匹配项
  • ) 负前瞻结束
  • [\w ]+$匹配输入字符串结尾的字符集内的一个字符

注意:\w[a-zA-Z0-9_] 的简写,除非设置了 u 修饰符。

【讨论】:

  • 请解释一下。我仍然无法与此相关:|
  • 哪部分需要进一步说明?
【解决方案2】:

您的正则表达式的一个问题是,在注释中,正则表达式必须匹配并使用整个字符串输入,而您的模式仅包含不使用任何文本的环视。

你可以使用

^(?!\d+$)(?![_\s]+$)[A-Za-z0-9\s_]+$

请参阅regex demo。请注意,\w(用于服务器端验证时,因此使用 .NET 正则表达式引擎解析)在服务器端验证时也将允许任何 Unicode 字母、数字和更多内容,所以我宁愿坚持到[A-Za-z0-9_] 以与服务器端和客户端验证保持一致。

详情

  • ^ - 字符串的开头(这里不是必需的,但调试时很好)
  • (?!\d+$) - 如果整个字符串由数字组成,则匹配失败的负前瞻
  • (?![_\s]+$) - 如果整个字符串由下划线和/或空格组成,则匹配失败。 注意:如果您打算只禁止 ____" " 类似的输入,则需要将此前瞻拆分为 (?!_+$)(?!\s+$)
  • [A-Za-z0-9\s_]+ - 1+ ASCII 字母、数字、_ 和空白字符
  • $ - 字符串结尾(这里不是必需的,但仍然很好)。

【讨论】:

  • 你对 unicode 字符是正确的。+1 :) 谢谢你的理解
【解决方案3】:

如果我正确理解您的要求,您需要匹配一个或多个字母(大写或小写),并且可能匹配零个或多个数字、空格或下划线。这意味着以下模式:

^[A-Za-z0-9\s_]*[A-Za-z][A-Za-z0-9\s_]*$

Demo

在演示中,我将\s 替换为\t \r,因为\s 在所有行中都匹配。

与@revo 和@wiktor 给出的答案不同,我对正则表达式没有花哨的解释。即使不化妆我也很漂亮。老实说,如果你不理解我给出的模式,你可能想查看一个好的正则表达式教程。

【讨论】:

  • 根据 OP,12_1 2 应该是匹配的,除非另有说明。
  • @AmeyaDeshpande 我完全不了解 C#,我也不知道您使用的是哪个正则表达式 API。您可能需要在我建议的模式周围放置 ^ $ 锚点。
  • 这工作正常但是@Wiktor Stribiżew 回答 unicode 被认为是一个有效的场景,即使我错过了要求
【解决方案4】:

这个简单的正则表达式应该可以做到:

[a-zA-Z]+[0-9_ ]*

一个或多个字母,后跟零个或多个数字、下划线和空格。

【讨论】:

  • 这种模式的(潜在)问题是它会取消像0A 这样的字符串的资格,即它确实包含一个字母,但只是不在第一个位置。
  • 显示的有效示例不以数字开头。
【解决方案5】:

这个应该不错:

[\w\s_]*[a-zA-Z]+[\w\s_]*

【讨论】:

    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多