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

时间:2015-06-23 09:54:13

标签: c# regex

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

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

让我们说文: "一旦我去了一家商店并以1美元购买了可乐,我又免费获得了一杯可乐#34;

在这个例子中,我希望匹配焦炭和美元这两个词。 所以结果应该是: 焦炭:指数37,长度4 美元:指数48,长度6 可乐:指数84,长度4

我已经拥有的是这个:(我认为这有点不对,因为它应该至少包含一个单词,所以+应该在那里而不是*)

(?:(\bcoke\b))\*(?:(\bdollar\b))\*

但是正如那个正则表达式一样,RegEx Buddy强调所有三个单词,如果我要求它强调第1组和第2组。

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

你能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:0)

我认为你只想使用正则表达式是不可能的。 这是使用正则表达式和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);
    }
}

输出:

Found: coke
    At 36 length 4
    At 72 length 4
Found: dollar
    At 47 length 6

答案 1 :(得分:0)

这个怎么样,虽然很糟糕,但我认为它有点工作它是纯粹的RegEx没有额外的工具。

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

如果您希望它捕获\wcokeDollar等,请删除dollarCoKe