我试图检查文本是否包含两个或更多特定单词。单词可以按任何顺序显示在文本中多次,但至少一次。
如果文本匹配,我需要获取有关单词位置的信息。
让我们说文: "一旦我去了一家商店并以1美元购买了可乐,我又免费获得了一杯可乐#34;
在这个例子中,我希望匹配焦炭和美元这两个词。 所以结果应该是: 焦炭:指数37,长度4 美元:指数48,长度6 可乐:指数84,长度4
我已经拥有的是这个:(我认为这有点不对,因为它应该至少包含一个单词,所以+应该在那里而不是*)
(?:(\bcoke\b))\*(?:(\bdollar\b))\*
但是正如那个正则表达式一样,RegEx Buddy强调所有三个单词,如果我要求它强调第1组和第2组。
但是当我在C#中运行时,我不会得到任何结果。
你能指出我正确的方向吗?
答案 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)
如果您希望它捕获\w
或cokeDollar
等,请删除dollarCoKe
。