簡體   English   中英

正則表達式強制字符串中特定字符的上限

[英]Regex to force upper limit of specific characters in a string

我有一個單詞列表,我需要消除所有出現i為零或不超過一個,出現o為零或不超過兩個,出現u次數為零或不超過三個的所有單詞。

例如:

in會工作,但inside不會。

onoctopus會工作,但commotion不會

到目前為止,我最好的猜測似乎並未完成工作:

Regex regex = new Regex(@"i?|o{0,2}|u{0,3}");
lines = text.Where(x => regex.IsMatch(x)).ToArray(); // text is array containing the words 

您的正則表達式僅檢查后續字符,例如uuu 所以這是行不通的。 通常,使用正則表達式有點困難,因為您將必須運行三個獨立的正則表達式來檢查每個字符,或者必須指定這些字符之間的順序的所有可能組合。

而是考慮不使用正則表達式來解決此問題。 以下解決方案非常簡單,並通過最多迭代一次來檢查每個字符串:

List<string> words = new List<string> { "in", "inside", "on", "octopus", "commotion" };

var result = words.Where(x =>
{
    var maxCounts = new Dictionary<char, int>{ { 'i', 1 }, { 'o', 2 }, { 'u', 3 } };
    foreach (char c in x)
    {
        if (maxCounts.ContainsKey(c))
        {
            maxCounts[c]--;
            if (maxCounts[c] < 0)
                return false;
        }
    }
    return true;
}).ToArray();
string[] text = new string[] { "in", "inside", "on", "octopus", "commotion" };

Regex regex = new Regex(@"(i.*){2}|(o.*){3}|(u.*){4}");
var lines = text.Where(x => !regex.IsMatch(x)).ToArray(); // text is array containing the words 
foreach (var s in lines)
{
    Console.WriteLine(s);
}

編輯

只是一個警告。 由於回溯,該解決方案無法擴展到大量字母。 為了提高縮放比例,必須禁用回溯:

Regex regex = new Regex(@"(?>.*?i){200}|(?>.*?o){300}|(?>.*?u){400}");

可以只使用帶有3的簡單正則表達式| 交替。

如果輸入是單個單詞,則用於匹配。

i.*?i|o(?:.*?o){2}|u(?:.*?u){3}

或者用於匹配文本中的單詞。

\b(?:(?>\w*?i){2}|(?>\w*?o){3}|(?>\w*?u){4})\w*

請參閱regexhero上的演示

暫無
暫無

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

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