如何知道字符串只包含特定的单词

时间:2015-03-24 14:59:21

标签: c# arrays regex string

如何检查字符串是否只包含数组中的单词?

如果字符串包含使用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 && },||Regextrue && 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}}

3 个答案:

答案 0 :(得分:6)

首先,您的代码会受到clbuttic problem的影响:对于包含“untrue”字样的字符串,它会返回true,因为代码不会注意字边界。

如果您想检查是否包含其他单词,请拆分字符串,并根据“已批准”单词列表检查每个项目:

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

这种方法意味着words中的单词不包含空格。

请注意,这不是最有效的方法,尽管它适用于小型列表。如果列表很长,请转而使用HashSet<string>

Demo.

答案 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