我试图找到一种方法来检查字符串是否只包含某个单词,或某个单词和日期。假设字符串可以有多个单词(如短句)和一个或多个日期(用连字符分隔)。 例如,如果某个单词是" 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.
}
}
答案 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是一个实现英语语法分析器的库。