C#中接受下划线和空格的Alpha字符串的正则表达式

时间:2018-09-13 10:35:13

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

我已经在 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#中的数据注释

请提出建议。

5 个答案:

答案 0 :(得分:2)

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

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

否定的超前查找将使整个过程失败,从而导致不需要的匹配。这些是仅包含数字,仅包含下划线或仅包含空格的字符串。如果它们从未发生,我们希望找到^[\w ]+$的匹配项,而该匹配项与^[a-zA-Z0-9_ ]+$几乎相同。

请参见live demo here

说明

  • ^行/字符串的开头
  • (?!否定超前开始
    • (?:非捕获组的开始
      • \d+匹配数字
      • |
      • _+匹配下划线
      • |
      • [ ]+匹配空间
    • )$非捕获组的结尾,紧随其后的是行/字符串的结尾( 以前没有匹配项
  • )否定超前结束
  • [\w ]+$将字符集中的一个字符匹配到输入字符串的末尾

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

答案 1 :(得分:1)

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

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

Demo

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

与@revo和@wiktor给出的答案不同,我对正则表达式没有花哨的解释。即使不化妆也很美丽。老实说,如果您不了解我给的模式,您可能想复习一个好的regex教程。

答案 2 :(得分:1)

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

您可以使用

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

请参见regex demo。请注意,\w(用于服务器端验证并因此与.NET regex引擎一起解析时)还将在服务器端验证时允许任何Unicode字母,数字和更多内容,因此,我想宁愿坚持使用[A-Za-z0-9_]来与服务器端验证和客户端验证保持一致。

详细信息

  • ^-字符串的开头(这里不是必需的,但是在调试时可以使用)
  • (?!\d+$)-如果整个字符串由数字组成,则否定超前行为将使匹配失败
  • (?![_\s]+$)-如果整个字符串包含下划线和/或空格,则否定超前匹配将失败。 注意:如果您打算仅禁止输入____" "之类的内容,则需要将此前瞻分为(?!_+$)(?!\s+$)
  • [A-Za-z0-9\s_]+-1个以上的ASCII字母,数字,_和空格字符
  • $-字符串的结尾(这里不是必需的,但是仍然很不错)。

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

这应该很好:

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