C# 尝试多次匹配多个单词,使用正则表达式的任意顺序

C# 尝试多次匹配多个单词,使用正则表达式的任意顺序,c#,regex,C#,Regex,我试图检查文本是否包含两个或更多特定单词。单词可以是任何顺序,可以在文本中出现多次,但至少出现一次 如果文本是匹配的,我需要获得有关单词位置的信息 假设我们有文本: “有一次,我去一家商店花一美元买了一瓶可乐,然后又免费得到了一瓶” 在这个例子中,我想匹配单词coke和dollar。 因此,结果应该是: 焦炭:指数37,长度4 美元:指数48,长度6 焦炭:指数84,长度4 我已经知道了:(我认为这有点错误,因为它应该包含每个单词至少一次,所以+应该在那里,而不是*) 但是有了这个正则表达式,正

我试图检查文本是否包含两个或更多特定单词。单词可以是任何顺序,可以在文本中出现多次,但至少出现一次

如果文本是匹配的,我需要获得有关单词位置的信息

假设我们有文本: “有一次,我去一家商店花一美元买了一瓶可乐,然后又免费得到了一瓶”

在这个例子中,我想匹配单词coke和dollar。 因此,结果应该是: 焦炭:指数37,长度4 美元:指数48,长度6 焦炭:指数84,长度4

我已经知道了:(我认为这有点错误,因为它应该包含每个单词至少一次,所以+应该在那里,而不是*)

但是有了这个正则表达式,正则表达式的伙伴会强调所有这三个词,如果我问它是hightlight group 1和group 2的话

但是当我在C#中运行这个时,我不会得到任何结果


你能给我指一下正确的方向吗

我认为仅仅使用正则表达式是不可能实现您想要的。 以下是使用正则表达式和linq的可能解决方案:

var words = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "coke", "dollar" };
var regex = new Regex(@"\b(?:"+string.Join("|", words)+@")\b", RegexOptions.IgnoreCase);
var text = @"Once I went to a store and bought a coke 
for a dollar and I got another coke for free";
var grouped = regex.Matches(text)
    .OfType<Match>()
    .GroupBy(m => m.Value, StringComparer.OrdinalIgnoreCase)
    .ToArray();

if (grouped.Length != words.Count)
{
    //not all words were found
}
else
{
    foreach (var g in grouped) 
    {
        Console.WriteLine("Found: " + g.Key);
        foreach (var match in g) 
            Console.WriteLine("    At {0} length {1}", match.Index, match.Length);
    }
}

这个怎么样,它很不错,但我认为它有一个工作的机会,它是纯正则表达式,没有额外的工具

(?:^\W)[cC][oO][kK][eE](?:$\W)[dD][oO][lL][aA][rR](?:$\W)


如果要捕获
可口可乐
多拉可乐
等,请去掉
\w

但是当文本中只有一个单词时,这不匹配吗?这两个词都必须至少出现在文本中一次。@Kristinnn哦,我错过了。我会重拍的。其中任何一个单词(2个可乐就可以了)或两个单词必须至少出现一次?您可以简单地检查匹配项的长度是否大于等于2。是的,两个(所有)单词都需要在文本中至少出现一次,但可以多次出现,例如,可口可乐只能出现一次,美元可以出现100次。如果其中一个单词没有出现,它应该完全匹配。记住,单词可能比可口可乐和美元还多。我不确定是否可以只使用正则表达式来完成所需的操作。
var words = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "coke", "dollar" };
var regex = new Regex(@"\b(?:"+string.Join("|", words)+@")\b", RegexOptions.IgnoreCase);
var text = @"Once I went to a store and bought a coke 
for a dollar and I got another coke for free";
var grouped = regex.Matches(text)
    .OfType<Match>()
    .GroupBy(m => m.Value, StringComparer.OrdinalIgnoreCase)
    .ToArray();

if (grouped.Length != words.Count)
{
    //not all words were found
}
else
{
    foreach (var g in grouped) 
    {
        Console.WriteLine("Found: " + g.Key);
        foreach (var match in g) 
            Console.WriteLine("    At {0} length {1}", match.Index, match.Length);
    }
}
Found: coke
    At 36 length 4
    At 72 length 4
Found: dollar
    At 47 length 6