[英]Trying to match multiple words multiple times, any order using regex
我正在嘗試檢查文本是否包含兩個或更多個特定的單詞。 單詞可以以任意順序出現,也可以多次出現在文本中,但至少出現一次。
如果文本匹配,則需要獲取有關單詞位置的信息。
可以說,我們有這樣的文字: “一旦我去一家商店買了1美元的可樂,我又免費得到了另一可樂”
在此示例中,我想將單詞可樂和美元匹配。 因此結果應為:焦炭:索引37,長度4美元:索引48,長度6焦炭:索引84,長度4
我已經是這樣的:(我認為這有點不對,因為它應該至少包含每個單詞一次,所以+應該在這里而不是*)
(?:(\bcoke\b))\*(?:(\bdollar\b))\*
但是,如果我要求正則表達式,則正則表達式Buddy會突出顯示所有三個詞,以突出顯示第1組和第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);
}
}
輸出:
Found: coke
At 36 length 4
At 72 length 4
Found: dollar
At 47 length 6
怎么樣,這確實很糟糕,但是我認為它在工作上有優勢, 並且它是純正則表達式,沒有額外的工具。
(?:^|\\W)[cC][oO][kK][eE](?:$|\\W)|(?:^|\\W)[dD][oO][lL][lL][aA][rR](?:$|\\W)
如果要捕獲cokeDollar
或dollarCoKe
等,請擺脫\\w
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.