Как проверить, содержит ли строка символы, находящиеся вне заданного списка символов - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть строка, и мне нужно проверить, содержит ли эта строка символы, которых нет в данном списке.

Предположим, у меня есть разрешенные символы new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' , '.'}

Если строкаis «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 ]

0 голосов
/ 19 декабря 2018

Если массив разрешенных символов является динамическим, вы можете создать процедуру, которая будет принимать массив разрешенных символов и создавать шаблон на лету.Обратите внимание, что для использования в регулярном выражении вы должны экранировать определенные символы:

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
0 голосов
/ 19 декабря 2018

Это просто достичь.Тип 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);
    }
}
0 голосов
/ 18 декабря 2018

Это можно сделать, используя очень простой шаблон.Regex.IsMatch(yourString, @"^[\d.]+$");

^ - начало строки

[\d.]+ соответствует одному или нескольким символам (. или 0-9)

$ это конец строки

Демо

Редактировать: Это также будет соответствовать .

Если это поведение не предназначено, попробуйтеиспользуя это ^(?=\d)[\d.]+$

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...