我试图在所有这些情况中找到特定短语"is better"
之前的左侧单词,但不包括输入3:
string input = "I think that green bike is better than the red bike"; // input 1
string input = "I think that green bike is better"; // input 2
string input = "is better than the red one"; // input 3
string input = "bike is better"; // input 4
我尝试了三种方法,但是这些方法都没有给我想要的结果,即在除输入3之外的所有三个输入情况下,在搜索短语
"is better"
之前只找到左侧单词,此处为"bike"
,而不搜索短语本身。请注意保留所有HTML标签。 var matches = Regex.Matches(input, @"(?:\S+\s)?\S*is better\S*(?:\s\S+)?", RegexOptions.IgnoreCase);
var list = matches.Cast<Match>().Select(match => match.Value).ToList();
foreach (string x in list)
{
Console.WriteLine("1) " + x);
}
2)
var regex = new Regex(@"(?:is better\s)(?<word>\b\S+\b)");
var matchCollection = regex.Matches(input);
foreach (Match match in matchCollection)
{
Console.WriteLine("2) " + match.Groups["word"].Value);
}
3)
string pattern = @"(?<before>\w+) is better (?<after>\w+)";
MatchCollection matche = Regex.Matches(input, pattern);
for (int i = 0; i < matche.Count; i++)
{
Console.WriteLine("3) before: " + matche[i].Groups["before"].ToString());
Console.WriteLine("3) after: " + matche[i].Groups["after"].ToString());
}
使用 输入 1: "我认为绿色自行车比红色自行车更好"
的结果是:
1) bike is better than
2) than
3) before: bike
3) after: than
1)
的结果是短语"is better"
的左右两个单词。2)
的结果是"is better"
后面的"then"
单词。3)
的结果再次是前后两个单词,正是我所需要的,但这种方法的问题在于第二个结果中已经显现出来了。对于输入2:
"我认为绿色自行车更好"
的结果是:1) bike is better
1)
的结果是单词"bike"
,它在短语"is better"
之前,但包含了搜索短语"is better"
。 2)
的结果为空,因为它查找"is better"
之后的单词,所以结果是正确的。即使单词"bike"
在"is better"
之前存在,但如果"is better"
之后没有其他单词并且它是字符串中的最后一个单词,则3)
的结果也为空。使用输入 3:
"is better than the red one"
,结果如下:1) is better than
2) than
1)
的结果是,在"is better"
后面存在一个正确的单词,因为前面的单词不存在,并且再次搜索包含"is better"
的短语。结果1)
是在"is better"
后面的单词"then"
。
而带有输入4:"bike is better"
的结果是:
1) bike is better