如何检查字符串是否只包含数组中的单词?
如果字符串包含使用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
? true && false || false && false
true || false && false && false
中是否有任何选项,或者有人可以提出一个好的解决方案吗?
修改
以下内容应该返回true
true
以下内容应返回false,因为它包含false
,&&
,||
,,
true & false || false < false
true >> false && false && false
true and false 123 false && false
true || false && false xyz false
以外的字/数字/特殊字符
{{1}}
答案 0 :(得分:6)
首先,您的代码会受到clbuttic problem的影响:对于包含“untrue”字样的字符串,它会返回true
,因为代码不会注意字边界。
如果您想检查是否包含其他单词,请拆分字符串,并根据“已批准”单词列表检查每个项目:
var allApproved = strCondition.Split(' ').All(word => words.Contains(word));
这种方法意味着words
中的单词不包含空格。
请注意,这不是最有效的方法,尽管它适用于小型列表。如果列表很长,请转而使用HashSet<string>
。
答案 1 :(得分:1)
你可以这样做:
var regex = new Regex(@"(^(true|false|&&|\|\|)$)");
return regex.IsMatch(input);
答案 2 :(得分:1)
这是另一个答案,似乎是你最初提出的问题。如果我做得对,你想知道List<string>
中的文本中是否只有子字符串。
所以&#34;不真实&#34;将返回false
,因为&#34; un&#34;不在允许的单词列表中#34; (更好的子串)。但是&#34; truetrue&#34;将被允许。
然后看看这个看起来比较麻烦的方法,但它需要检查与接受的答案不同的东西:
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