簡體   English   中英

嘗試多次匹配多個單詞,使用正則表達式的任何順序

[英]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)

如果要捕獲cokeDollardollarCoKe等,請擺脫\\w

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM