繁体   English   中英

如何验证字符串以仅允许其中包含字母数字字符?

[英]How can I validate a string to only allow alphanumeric characters in it?

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

(我也不想允许有任何空格)。

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

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

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

笔记! 这个答案没有严格检查字母数字(通常是 AZ、az 和 0-9)。 这个答案允许像åäö这样的本地字符。

更新 2018-01-29

仅当您使用具有正确类型的单个参数(在本例中为char )的单个方法时,上述语法才有效。

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

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

使用以下表达式:

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

IE:

using System.Text.RegularExpressions;

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

您可以使用扩展函数而不是正则表达式轻松完成...

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)));
}

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

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,并且知道如果你得到一个,它是有效的(除了空值)。 如果有人试图传入未经验证的字符串,则会生成编译器错误。

如果您关心的话,您可以更高级并实现所有相等运算符,或者从普通 ol' 字符串显式转换为 AlphaNumericString。

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

在这里混合各种答案和评论,以及来自https://stackoverflow.com/a/9975693/292060 的讨论,这将测试字母或数字,避免其他语言字母,并避免其他数字,如分数字符。

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

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

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

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

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

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

此处相同的答案。

如果您想要非正则表达式 ASCII Az 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;
    }

根据 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);
    }
}

虽然有很多方法可以给这只猫剥皮,但我更喜欢将这些代码包装到可重用的扩展方法中,这样以后的工作就变得微不足道了。 使用扩展方法时,您还可以避免使用 RegEx,因为它比直接字符检查慢。 我喜欢使用 Extensions.cs NuGet 包中的扩展。 它使这项检查变得如此简单:

  1. https://www.nuget.org/packages/Extensions.cs包添加到您的项目中。
  2. 将“ using Extensions; ”添加到代码的顶部。
  3. "smith23".IsAlphaNumeric()将返回 True 而"smith 23".IsAlphaNumeric(false)将返回 False。 默认情况下, .IsAlphaNumeric()方法会忽略空格,但它也可以被覆盖,如上所示。 如果你想允许空格,这样"smith 23".IsAlphaNumeric()将返回 True,简单默认 arg。
  4. 其余代码中的所有其他检查都只是MyString.IsAlphaNumeric()

我建议不要依赖 .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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM