如何验证字符串中仅包含字母数字字符?


117

如何使用正则表达式验证字符串以仅允许使用字母数字字符?

(我也不希望有任何空格)。

Answers:


181

使用以下表达式:

^[a-zA-Z0-9]*$

即:

using System.Text.RegularExpressions;

Regex r = new Regex("^[a-zA-Z0-9]*$");
if (r.IsMatch(SomeString)) {
  ...
}

在javascript中,我猜也是一样吗?
mrblah

4
如果您清理数据库名称或类似的内部名称,则不在乎是否不在英语国家/地区运行。
Ognyan Dimitrov

15
我讨厌正则表达式。我知道我永远不会记住语法。即使我学习了它,很快也会有一段时间再次被人们遗忘。
Sentinel

1
@菲尔 也许吧,但是到那时我将委派一个知道正则表达式的人;-)
前哨

3
有人说:“如果使用正则表达式解决问题,那么就会有两个问题。”
O. Jones

205

在.NET 4.0中,您可以使用LINQ:

if (yourText.All(char.IsLetterOrDigit))
{
    //just letters and digits.
}

yourText.All将会停止执行并返回false第一次char.IsLetterOrDigit报告,false因为那时合同All无法履行。

注意!此答案不严格检查字母数字(通常是AZ,az和0-9)。此答案允许使用本地字符åäö

更新2018-01-29

上面的语法仅在使用具有正确类型的单个参数(在这种情况下char)的单个方法时有效。

要使用多个条件,您需要这样编写:

if (yourText.All(x => char.IsLetterOrDigit(x) || char.IsWhiteSpace(x)))
{
}

1
如果速度不快,我会感到惊讶。无需进行正则表达式的编译或评估,只需进行简单比较即可。
jgauffin

3
现在,这只是美丽,朴素和简单。
Sentinel

3
如果您要确保yourText绝对是字母数字,这不会失败吗?它可以是全数字或全字母,但仍满足此条件。
itsbalur 2015年

2
@itsbalur:是的,但这不是问题。
jgauffin

2
我认为这个答案是完全错误的,假设字母数字集为AZ,az和0-9,因为这涵盖了Unicode字母和数字的整个范围,其中也包括非拉丁字符。例如,char.IsLetterOrDigit('ก')将返回truecsharppad.com/gist/f96a6062f9f8f4e974f222ce313df8ca
TIA

34

您可以使用扩展功能而不是正则表达式轻松地做到这一点...

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    for (int i = 0; i < str.Length; i++)
    {
        if (!(char.IsLetter(str[i])) && (!(char.IsNumber(str[i]))))
            return false;
    }

    return true;
}

每条评论:) ...

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    return (str.ToCharArray().All(c => Char.IsLetter(c) || Char.IsNumber(c)));
}

2
可能是个问题,但我将循环表示为“ foreach(str中的char c){...}”。是否将空字符串视为OK取决于应用程序,因此我将其删除。我也不会在这条琐碎的例程中填充6个空行,但是我想那是C#/ Java / C ++风格的-编码人员似乎是由屏幕空间支付的。无论如何,这是正确的方向,所以+1。
Svante,2009年

3
我认为我们想在这种情况下使用IsDigit,而不是IsNumber-IsNumber对于数字或看起来像数字的东西(分数,罗马数字等)将返回true 。请参阅msdn.microsoft.com/ zh-cn / library / yk2b3t2y.aspx)。鉴于此,并且如果一个人感觉特别邪恶,则可以进一步压缩IsAlphaNum的内容:return string.IsNullOrEmpty(str)?false:str.ToCharArray()。All(Char.IsLetterOrDigit);
堆叠

4
请注意,对于a-zA-Z以外的“字母”,Char.IsLetter的评估结果为true。例如,日语あ,中文的,韩语한等被视为Unicode“字母”。如果这是您的意图,那么很好,但是从其他答案中的各种正则表达式表达式来看,这可能不是最被认为是alpha [numeric]的东西。
2014年

就我而言,除了IsLetter和IsNumber外,我还需要IsWhiteSpace,因此我将其添加到了您的代码中,并且效果很好!
本少年

使用char.IsLetterOrDigit替代IsLetter + ISNUMBER
nick_n_a

17

虽然我认为基于正则表达式的解决方案可能是我要采用的方式,但我很想将其封装为一种类型。

public class AlphaNumericString
{
    public AlphaNumericString(string s)
    {
        Regex r = new Regex("^[a-zA-Z0-9]*$");
        if (r.IsMatch(s))
        {
            value = s;                
        }
        else
        {
            throw new ArgumentException("Only alphanumeric characters may be used");
        }
    }

    private string value;
    static public implicit operator string(AlphaNumericString s)
    {
        return s.value;
    }
}

现在,当您需要一个经过验证的字符串时,可以让方法签名需要一个AlphaNumericString,并且知道如果得到一个,则它是有效的(除了null)。如果有人尝试传递未经验证的字符串,则会生成编译器错误。

如果您愿意的话,您可以更轻松地实现所有相等运算符,或者从纯字符串'显式转换为AlphaNumericString。


我从未见过这种方法,但我喜欢意图的明确性和理由。+1。
科里之家,

1
这对我来说是新的。我正在尝试了解这一static public implicit operator string部分
Hassan Gulzar 2014年

8

我需要检查AZ,az,0-9;没有正则表达式(即使OP要求使用正则表达式)。

在此处混合各种答案和评论,以及来自https://stackoverflow.com/a/9975693/292060的讨论,此测试可测试字母或数字,避免使用其他语言字母以及避免使用其他数字(例如小数字符)。

if (!String.IsNullOrEmpty(testString)
    && testString.All(c => Char.IsLetterOrDigit(c) && (c < 128)))
{
    // Alphanumeric.
}

4

^\w+$ 会允许 a-zA-Z0-9_

^[a-zA-Z0-9]+$用于禁止下划线。

请注意,这两个都要求字符串不能为空。使用*而不是+允许空字符串。


我如何更改您的^ \ w + $以也允许“-”破折号?
尼尔·戴维斯

@NealDavis^[\w-]+$
Zachafer

2

为了检查字符串是否同时是字母和数字的组合,可以使用.NET 4.0和LINQ如下重写@jgauffin答案:

if(!string.IsNullOrWhiteSpace(yourText) && 
yourText.Any(char.IsLetter) && yourText.Any(char.IsDigit))
{
   // do something here
}

这将错误地识别包含其他字符的字符串以及字母数字...
nsimeonov

1

这里的答案相同。

如果要进行非正则表达式ASCII A-z 0-9检查,则不能使用char.IsLetterOrDigit()它,因为它包括其他Unicode字符。

您可以做的是检查字符代码范围。

  • 48-> 57是数字
  • 65-> 90为大写字母
  • 97-> 122为小写字母

以下内容比较冗长,但这是为了易于理解,而不是为了编写代码。

    public static bool IsAsciiAlphaNumeric(this string str)
    {
        if (string.IsNullOrEmpty(str))
        {
            return false;
        }

        for (int i = 0; i < str.Length; i++)
        {
            if (str[i] < 48) // Numeric are 48 -> 57
            {
                return false;
            }

            if (str[i] > 57 && str[i] < 65) // Capitals are 65 -> 90
            {
                return false;
            }

            if (str[i] > 90 && str[i] < 97) // Lowers are 97 -> 122
            {
                return false;
            }

            if (str[i] > 122)
            {
                return false;
            }
        }

        return true;
    }

0

根据cletus的答案,您可以创建新的扩展名。

public static class StringExtensions
{        
    public static bool IsAlphaNumeric(this string str)
    {
        if (string.IsNullOrEmpty(str))
            return false;

        Regex r = new Regex("^[a-zA-Z0-9]*$");
        return r.IsMatch(str);
    }
}

-8

我建议不要依赖.NET框架中现成的内置代码,请尝试提出新的解决方案。这是我的工作。

public  bool isAlphaNumeric(string N)
{
    bool YesNumeric = false;
    bool YesAlpha = false;
    bool BothStatus = false;


    for (int i = 0; i < N.Length; i++)
    {
        if (char.IsLetter(N[i]) )
            YesAlpha=true;

        if (char.IsNumber(N[i]))
            YesNumeric = true;
    }

    if (YesAlpha==true && YesNumeric==true)
    {
        BothStatus = true;
    }
    else
    {
        BothStatus = false;
    }
    return BothStatus;
}

2
您能在代码中添加一些解释吗,只是转储代码在这里不受欢迎
Draken

他们还要求使用正则表达式,这不是正则表达式
Draken

感谢您的评论和观察。正如我所建议的,我有自己的编写代码的方法。
Mahdi Al Aradi

5
您对不依赖.Net中的预构建代码的评论毫无意义,如果您不应该依赖预构建代码,那么您不应该使用该char.IsNumber()方法,因为那是预构建代码?
德拉肯

4
这段代码很好地说明了为什么自己重新发明它是一个坏主意-它实际上并没有做您想做的事情!(字符串“ @ 1a”将错误地返回true,字符串“ a”将返回false)
Flexo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.