C# 检查字符串是否仅包含某个单词?
我试图找到一种方法来检查字符串是否只包含某个单词,或者某个单词和日期。假设字符串可以有多个单词(如短句)和一个或多个日期(用连字符分隔)。 例如,如果某个单词是“On”或“On”,那么C# 检查字符串是否仅包含某个单词?,c#,string,C#,String,我试图找到一种方法来检查字符串是否只包含某个单词,或者某个单词和日期。假设字符串可以有多个单词(如短句)和一个或多个日期(用连字符分隔)。 例如,如果某个单词是“On”或“On”,那么 在这种情况下,您必须使用语法分析器来告诉您单词在句子中的角色。所以,如果是介词,我们认为是错误的,等等。 是一个实现了英语语法分析器的库。如果我正确理解了您的问题,您希望检查字符串是否包含“On”或“On”,但您会将其降低,使其仅为“On” 您可以将字符串拆分为空格,然后检查是否匹配“开”。 这里只是一个简单的例
在这种情况下,您必须使用语法分析器来告诉您单词在句子中的角色。所以,如果是介词,我们认为是错误的,等等。
是一个实现了英语语法分析器的库。如果我正确理解了您的问题,您希望检查字符串是否包含“On”或“On”,但您会将其降低,使其仅为“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;
}
}
}
正如我在评论中所描述的:
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;
}
}
private bool IsValidString(字符串str)
{
//将原始字符串小写
字符串下限=str.ToLower();
//按空间分割。
列表部分=较低的.Split(“”).ToList();
//然后检查它是否包含“on”
如果(部件包含(“on”))
{
//摆脱“on”的干扰影响
零件。移除(“打开”);
//并且进一步检查其余的是否包含至少更多的字母。这允许出现数字
if(parts.Any(x=>x.tocharray().Any(y=>char.IsLetter(y)))
{
返回false;
}
//检查这里的日期格式
return true;//此处字符串中只有“on2”作为单词存在
}
else//如果没有“开”,那么它无论如何都是假的
{
返回false;
}
}
您可以使用检查字符串的其余部分是否包含任何字母
编辑:此代码将解析您给出的所有示例。在我用注释指出的点上检查您需要包含的日期格式在s上有多个
如何?它会返回true还是false?可能正则表达式
帮助?模式^(O | O)n+
你实际上是用文字将整个算法写进了你的文章中。你可以用
拆分,然后看它的左边。然后勾选“一旦它包含另一个按字母顺序排列的单词,如“turn”或“abc”或其他任何东西“然后返回false
。有帮助吗?您还有其他问题吗?@vahdet在
s上有多个,也应该返回false。如果您能提供一个示例,我们就可以看到您目前的尝试了。此外,这感觉像一个XY问题-。你能解释一下你为什么要这么做吗?谢谢!但不幸的是,我认为这是行不通的,因为在代码中,“打开”仍然会返回true。它实际上需要返回false。好吧,这样就行了。将它放入foreach循环if(word.Any(x=>char.isleter(x)){if(word.ToLower()=“on”){match=true;}else{match=false;break;}
谢谢你,Mong Zhu!这很有魅力。我也测试了所有示例,也测试了更多,效果都很好。我将自己添加日期格式部分!非常感谢你的帮助!@MikaJones欢迎你。linq部分也可以通过正常的for循环实现。祝你有愉快的一天
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;
}
}
}
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;
}
}