如何检查字符串是否包含给定char列表之外的字符

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (37)

我有一个字符串,我需要检查此字符串是否包含任何不在给定列表中的字符。

假设我有这个允许的字符 new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' , '.'}

如果字符串是“54323.5” - 这没关系!

如果string是“543g23.5” - 这将不正常,因为它包含“g”,它不在我允许的字符列表中。

空字符串被视为无效。

我试图通过使用“IndexOfAny()”来实现这一点但到目前为止没有运气。当然,将所有不允许的字符传递给此方法将不是解决方案。

请注意,允许的字符列表可能会更改,并且根据列表更改更改验证算法不被视为解决方案。

这里是:

        private bool CheckInvalidInput(string stringToCheck)
    {
        char[] allowedChars = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

        var chars = Enumerable.Range(0, char.MaxValue + 1)
                  .Select(i => (char)i)
                  .ToArray();

        var unallowedChars = chars.Except(allowedChars).ToArray();

        bool validString = true;
        if(stringToCheck.IndexOfAny(unallowedChars) != -1)
        {
            validString = false;
        }

        return validString;
    }

希望您能找到更好的解决方案。

提问于
用户回答回答于

这很容易实现。该string式工具IEnumerable<char>,这样你就可以使用LINQ All方法来检查它的所有字符满足谓语。在您的情况下,谓词是每个字符都包含在allowedChars集合中,因此您可以使用以下Contains方法:

private static bool CheckInvalidInput(string stringToCheck, IEnumerable<char> allowedChars)
{
    return stringToCheck.All(allowedChars.Contains);
}

如果您的allowedChars集合变大,您可能希望将其转换HashSet<char>为更好的性能。

完整示例:

using System;
using System.Linq;
using System.Collections.Generic;

public class Test
{
    public static void Main()
    {
        // var allowedChars = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' };
        var allowedChars = "0123456789.";

        Console.WriteLine(CheckInvalidInput("54323.5", allowedChars));   // True
        Console.WriteLine(CheckInvalidInput("543g23.5", allowedChars));  // False
    }

    private static bool CheckInvalidInput(string stringToCheck, IEnumerable<char> allowedChars)
    {
        return stringToCheck.All(allowedChars.Contains);
    }
}
用户回答回答于

这可以使用非常简单的模式来完成。 Regex.IsMatch(yourString, @"^[\d.]+$");

^ 是这行的开始

[\d.]+匹配一个或多个字符(.或者0-9

$ 是行的结束

如果不打算这样做,请尝试使用此方法 ^(?=\d)[\d.]+$

扫码关注云+社区

领取腾讯云代金券