c# 中接受下划线和空格的字母数字字符串的正则表达式

Regex for alpha number string in c# accepting underscore and white spaces

我已经在 SO 上经历了很多 post。我没有找到我的特定场景所需的内容。

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

有效字符串:

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#

中的数据注释中无效

请推荐。

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

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

Demo

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

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

这个简单的 RegEx 应该可以做到:

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

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

这个应该不错:

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

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

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

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

几乎相同

live demo here

说明:

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

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

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

您可以使用

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

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

详情

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