Игнорировать вопросительные знаки при сравнении двух строк - PullRequest
0 голосов
/ 06 мая 2020

У меня

public readonly IEnumerable<string> QuestionStrings = new List<string>
        {
           // okay?,are you okay?,what to do?
        };

Я читаю ввод от пользователя, и если ввод соответствует одному из вопросов, перечисленных выше, я хочу отправить пользователю конкретное c сообщение.

Моя проблема в том, что я хочу, чтобы сравнение было без учета регистра и без учета вопросительного знака.

Итак, если пользователь вводит "окей?", "Окей?", Окей или окей, я хочу обрабатывать все эти сообщения одинаково и отправлять такое же c сообщение пользователю

Мне удалось сравните строку, касающуюся нечувствительности к регистру

QuestionStrings.Contains(userInput, StringComparer.OrdinalIgnoreCase);

, но я не смог найти способ игнорировать вопросительный знак

Любой способ сделать это? "кроме проверки ввода от пользователя, содержит ли он? или нет в конце"

Ответы [ 4 ]

1 голос
/ 06 мая 2020

Гибкий и выразительный подход к коду заключался бы в том, чтобы определить ваши требования с помощью списка регулярных выражений (возможно, хранящихся в таблице ресурсов или базе данных), а затем напрямую преобразовать их в журнал времени выполнения c.

Инициализация:

//In a practical application you would load this from a resource or database
List<string> QuestionStrings = new List<string>
{
   "^okay.$",          //Can appear anywhere in string with or without question mark
   "are you okay.",    //Must be the entire string, with or without question mark
   "^what to do\?"     //Question mark is required
};

var regexs = QuestionStrings.Select( s => new RegEx(s) ).ToList();

Затем, как только вы введете пользовательский ввод, проверьте соответствие:

var match = regexs.Any( x => x.IsMatch( userInput ) );
1 голос
/ 06 мая 2020

Вместо того, чтобы игнорировать их, вы можете удалить их на первом месте в своем списке и удалить их из входной строки при сравнении:

public readonly IEnumerable<string> QuestionStrings = new List<string>
{
   "okay",
   "are you okay",
   "what to do"
};

...

QuestionStrings.Contains(userInput.Replace('?', ''), StringComparer.OrdinalIgnoreCase);

Другой вариант, если вы настаиваете на сохранении знаков вопроса в списке - использовать Any вместо Contains - это позволит вам использовать лямбда-выражение для выполнения сравнения:

QuestionStrings.Any(s => s
    .Replace('?', '')
    .Equals(userInput.Replace('?', ''), StringComparison.OrdinalIgnoreCase));
0 голосов
/ 06 мая 2020

Вы можете использовать то, что здесь упоминается: { ссылка } Цель состоит в том, чтобы проанализировать каждый символ из строки, чтобы принимать только символы от a до z

0 голосов
/ 06 мая 2020

Вы можете попробовать это:

QuestionStrings.Contains(userInput.Replace("?","").Trim(), StringComparer.OrdinalIgnoreCase);
...