[英]Regex to force upper limit of specific characters in a string
我有一個單詞列表,我需要消除所有出現i
為零或不超過一個,出現o
為零或不超過兩個,出現u
次數為零或不超過三個的所有單詞。
例如:
in
會工作,但inside
不會。
on
和octopus
會工作,但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*
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.