检查字符串是否只包含某个单词?

时间:2018-06-08 11:54:42

标签: c# string

我试图找到一种方法来检查字符串是否只包含某个单词,或某个单词和日期。假设字符串可以有多个单词(如短句)和一个或多个日期(用连字符分隔)。 例如,如果某个单词是" On"或" on",然后......

string | result
"On" | true
"On 4/31" | true
"on 4/31/2018" | true
"4/13 On" | true
"4/31-5/4 on" | true
"4/31 - 5/4 on" | true
"Turn on" | false
"Turn on 5/4" | false
"On site" | false
"On 4/15 abc" | false
<Any other string that does not contain "on" at all> | false

正如您所看到的,对于字符串true,必须有&#34; on&#34;在字符串中的某个位置,它也可以有一个或多个日期(带连字符)表达式。但是,一旦它包含另一个字母词,如&#34;转&#34;或&#34; abc&#34;或其他任何东西,然后它需要返回false。 &#34;在&#34;或&#34; on&#34;需要出现一次,这需要是整个字符串中唯一的单词。订单无关紧要,所以&#34; on&#34;或&#34; On&#34;可以发生在字符串的开头或结尾&#34;

有没有办法检查这个?我首先想到的是str.Contains("On"),但是对于&#34;打开&#34;当它需要返回false时。 str.StartsWith("On")str.EndsWith("On")也不起作用。

顺便说一下,&#34; On&#34; &#34; on&#34;两个都没关系,所以我在检查之前要去ToLower字符串,所以&#34; On&#34; &#34; on&#34;两者都会产生相同的结果。

我希望我的问题有道理,有人可以就如何实现这个问题给我建议吗?

编辑:这是我编写的一些代码,虽然它还没有完整,因为我仍在努力。

//str is the string to be examined
private bool IsValidString(string str)
{
    //Lowercase the original string 
    string lower = str.ToLower();

    //Get the number of occurrences of the substring "on"
    int occurrence = System.Text.RegularExpressions.Regex.Matches(lower, "on").Count;

    //If the occurrence count is 0, or more than 1, return false
    if (occurrence == 0 || occurrence > 1)
            return false;

    //Split the string by ' '
    string[] strArr = lower.Split(' ');

    for (int i = 0; i <= strArr.Length; i++)
    {
        //struggling in here... need to check if any other word
        //is included in the array. Still date expression is allowed.
    }
}

3 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,你想检查字符串是否包含“开”或“开”但是你会降低它以便它只会“开启”?

您可以在空格上拆分字符串,然后检查是否匹配“on”我猜。 这只是一个简单的例子。你可以用更好的方式做到这一点,但它只是一个PoC

string example = "On 4/15 abc";
string[] words = example.Split(' ');
bool match = false;
foreach(string word in words)
{
    if (word.Any(x => char.IsLetter(x))) {
        if (word.ToLower() == "on") 
        {
            match = true;
        } 
        else 
        { 
            match = false; break;
        }
    }
}

答案 1 :(得分:1)

正如我在评论中已经描述的那样:

private bool IsValidString(string str)
{
    //Lowercase the original string 
    string lower = str.ToLower();
    //split by space. 
    List<string> parts = lower.Split(' ').ToList();

    //Then check if it contains "on" 
    if (parts.Contains("on"))
    {
        // get rid of the disturbing influence of "on"
        parts.Remove("on");
        //and furthermore check if the rest contains at least on further letter. This allows for numbers to appear
        if (parts.Any(x => x.ToCharArray().Any(y=> char.IsLetter(y))))
        {
            return false;
        }
        // CHECK here for the date format
        return true; // here only "on2 exists in the string as a word
    }
    else // if no "on" then it is false anyway
    {
        return false;
    }   
}

您可以使用Char.IsLetter检查字符串的其余部分是否包含任何字母

编辑:此代码将解析您提供的所有示例。检查您需要在我用评论指出的点上包含的日期格式

答案 2 :(得分:0)

在这种情况下,您必须使用语法分析器来告诉您单词在句子中的作用。所以,如果它是介词,我们认为它是假的等等。 here是一个实现英语语法分析器的库。