为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕后森 2022-06-18 17:42:50
我有一个字符串,我需要检查这个字符串是否包含任何不在给定列表中的字符。假设我有这个允许的字符new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' , '.'}如果字符串是“54323.5” - 这没关系!如果字符串是“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;    }希望您能提供更好的解决方案:D。
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

这很容易实现。该string类型实现IEnumerable<char>,因此您可以使用 LINQAll方法检查其所有字符是否满足谓词。在您的情况下,谓词是每个字符都包含在allowedChars集合中,因此您可以使用以下Contains方法:


private static bool CheckInvalidInput(string stringToCheck, IEnumerable<char> allowedChars)

{

    return stringToCheck.All(allowedChars.Contains);

}

如果您的allowedChars集合变大,您可能希望将其转换为 aHashSet<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);

    }

}


查看完整回答
反对 回复 2022-06-18
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

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

^是行的开头

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

$是行尾

演示

编辑:这也将匹配.

如果此行为不是有意的,请尝试使用此^(?=\d)[\d.]+$


查看完整回答
反对 回复 2022-06-18
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

如果允许的字符数组是动态的,您可以创建过程,该过程将接受允许的字符数组并动态构建模式。请注意,您必须转义某些字符才能在 Regex 中使用:


static void TestRegex(char[] check_chars)

{

    string[] inputs = { "54323.5", "543g23.5" };

    var check_chars2 = check_chars.Select(c => Regex.Escape(c.ToString()));

    string pattern = "^(" + string.Join("|", check_chars2) + ")+$";

    foreach (string input in inputs)

    {

        WriteLine($"Input {input} does{(Regex.IsMatch(input, pattern) ? "" : " not")} match");

    }

}


// Output:

// Input 54323.5 does match

// Input 543g23.5 does not match


查看完整回答
反对 回复 2022-06-18
  • 3 回答
  • 0 关注
  • 287 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号