regex C#正则表达式:检查“a-z”和“A-Z”

nvbavucw  于 2023-03-09  发布在  C#
关注(0)|答案(4)|浏览(184)

我想检查输入的字符串是否在a-z或A-Z之间。不知何故,我的正则表达式似乎没有拾取它。它总是返回真。我不知道为什么,我猜它与我如何编写我的正则表达式有关。任何帮助将不胜感激。

private static bool isValid(String str)
{
    bool valid = false;

    Regex reg = new Regex((@"a-zA-Z+"));

    if (reg.Match(str).Success)
        valid = false;
    else 
        valid  = true;     

     return valid;
}
yws3nbqq

yws3nbqq1#

Regex reg = new Regex("^[a-zA-Z]+$");
  • ^字符串的开头
  • []字符集
  • \+一次或多次
  • $字符串结尾

需要^$,因为您要验证所有字符串,而不是字符串的一部分

2eafrhcq

2eafrhcq2#

正确的方法应该是这样的:

private static bool isValid(String str)
{
    return Regex.IsMatch(str, @"^[a-zA-Z]+$");
}

此代码具有以下优点:

  • 使用静态方法,而不是每次都创建一个新示例:静态方法缓存正则表达式
  • 修正了正则表达式。它现在匹配由一个或多个字符a-z或A-Z组成的任何字符串。不允许使用其他字符。
  • 短得多,可读性强。
gwbalxhn

gwbalxhn3#

用途

Regex.IsMatch(@"^[a-zA-Z]+$");
fjaof16o

fjaof16o4#

.NET 7中的更新(2022年11月以后)

有一个名为Char.IsAsciiLetternew method,它将:
确定字符是在“A”到“Z”(包括A和Z)的范围内,还是在“a”到“z”(包括a和z)的范围内。
如果要测试字符串是否包含*任意个英语字母,可以使用Linq.Any

var hasLetter = "word".Any(Char.IsAsciiLetter); // true

如果要测试字符串是否只有***个英语字母,可以使用Linq.All

var allLetters = "word".All(Char.IsAsciiLetter); // true

生成的Regex源代码

.NET 7引入了GeneratedRegex,它允许您在编译时解析和编译regex语句,而且 * 还 * 允许您 * 检查任何在幕后完成的优化 *。如果您想了解regex字符串[a-zA-Z]实际上是如何实现的,您可以向任何dotnet 7项目添加以下内容

public static partial class RegexExtensions
{
    [GeneratedRegex("[a-zA-Z]")]
    public static partial Regex HasLetter();
}

然后查看生成代码的源代码,你会发现即使你尽可能高效地使用regex,它也只是在char类中使用了完全相同的方法:

性能基准测试

根据benchmark tests,检查字符串是否包含英语字母的最快方法是使用带有Char.IsAsciiLetterfor循环:

聚合物填充

如果您还没有接触过.NET 7,您可以查看如何实现该方法以实现性能感知:

public static bool IsAsciiLetter(char c) => (uint)((c | 0x20) - 'a') <= 'z' - 'a';

相关问题