2015-03-24 6 views
2

Как проверить, содержит ли строка только слова в массиве?Как знать, что строка содержит только определенные слова

я мог вернуться true, если строка содержит любое слово в массиве с помощью Contains()

public bool ValidateString(string strCondition) 
{ 
     List<string> words = new List<string>() { "true", "false", "&&", "||", " " }; 
     foreach (string word in words) 
     { 
      if(strCondition.Contains(word)) 
       return true;     
     } 
     return false; 
} 

Но как я могу вернуть false если строка, отправить в качестве параметра (strCondition) содержит любое слово или алфавит или номер или т.д. и т.д., кроме true, false, &&, ||, ? Есть ли какой-либо вариант в Regex или может кто-нибудь придумать хорошее решение?

EDIT

Следующая должен вернуть истинный

true && false || false && false 
true || false && false && false 

И ниже должен возвращать ложь, поскольку она содержит слово/число/специальные символы, кроме true, false, &&, ||,

true & false || false < false 
true >> false && false && false 
true and false 123 false && false 
true || false && false xyz false 
+0

так что вы хотите, чтобы проверить, все 'words' в' strCondition'? – Sayse

+0

Итак, вы не хотите искать _words_, но подстроки? –

+3

Ваш код уже вернет 'false', если ни одно из значений в' words' в 'strCondition' –

ответ

6

Во-первых, ваш код страдает от clbuttic problem: он вернет true для строки, которая имеет слово «неверное», потому что код не обращает внимания на границы слов.

Если вы хотели бы проверить, если никакие другие слова не содержатся, разделить строку и проверить каждый элемент со списком «одобрил» слова:

var allApproved = strCondition.Split(' ').All(word => words.Contains(word)); 

Этот подход предполагает, что слова в words не содержат пробелы.

Обратите внимание, что это не самый эффективный подход, хотя он будет работать отлично для небольшого списка. Если список очень длинный, переключитесь на HashSet<string>.

Demo.

+0

Я думаю, OP хочет знать, есть ли подстрока, которая не находится в списке 'words'. Таким образом, '||||' разрешен, но не' || -'. –

+0

Да Тим. В точку. Я хочу знать, есть ли строка, которая не находится в 'words' @Tim Schmelter –

+0

Это точное решение, которое я искал. Великий. Простой и хорошо объясненный с меньшим количеством строк кода. Плюс один. Спасибо, чувак :) –

1

Вы могли бы сделать что-то вроде этого:

var regex = new Regex(@"(^(true|false|&&|\|\|)$)"); 

return regex.IsMatch(input); 
1

Вот еще один ответ, который, кажется, что вы первоначально просили. Если бы я понял, что вам нужно знать, есть ли в тексте только подстроки, которые находятся в List<string>.

Так что «неверный» будет возвращать false, потому что «un» не находится в списке разрешенных «слов» (лучше подстроки). Но «truetrue» будет разрешено.

Тогда взгляните на этот метод, который выглядит более громоздким, но для этого нужно, чтобы проверить что-то другое, чем принято отвечать:

List<string> words = new List<string>() { "false", "true", "||", "&&", " " }; 

public bool ValidateString(string strCondition) 
{ 
    if(string.IsNullOrWhiteSpace(strCondition)) return true; 
    int charIndex = 0; 
    while (charIndex < strCondition.Length) 
    { 
     string wordFound = null; 
     foreach (string word in words) 
     { 
      if (word.Length + charIndex > strCondition.Length) 
       continue; 
      string substring = strCondition.Substring(charIndex, word.Length); 
      if (word == substring) 
      { 
       wordFound = word; 
       break; 
      } 
     } 
     if (wordFound == null) 
      return false; 
     else if (charIndex + wordFound.Length == strCondition.Length) 
      return true; 
     else 
      charIndex += wordFound.Length; 
    } 
    return false; 
} 

Обратите внимание, что я уже переупорядочен список, самые длинные строки должны прийти сначала, поскольку это более эффективно в алгоритме выше.

Два примера, чтобы продемонстрировать, что он делает:

bool check = ValidateString("truefalse||truetrue"); // true 
bool check = ValidateString("truefals||etruetrue"); // false 
+0

Не допускается 'truetrue'. 'true && true' или' true || true'. Я ценю усилия за ваш ценный ответ. Я обязательно буду использовать ваш код всякий раз, когда есть требование, которое требует, чтобы «truetrue» рассматривал как допустимую строку. Спасибо Тиму и +1 с моей стороны :) –

Смежные вопросы