我正在做一個填字游戲制造商。用戶選擇單詞的單元格,程式從字典中編譯一個填字游戲(所有可以在填字游戲中使用的單詞) - List<string>。
我需要在字典中找到與給定掩碼(模式)匹配的單詞(單詞)。
例如,我需要找到所有匹配的單詞
#a###g
模式,即6字典中所有長度為"a"at index1和"g"at index的單詞5
字母的數量和位置事先未知
我如何意識到這一點?
uj5u.com熱心網友回復:
您可以轉換文字描述 ( mask)
#a###g
成對應的正則運算式模式:
^\p{L}a\p{L}{3}g$
模式解釋:
^ - anchor, word beginning
\p{L} - arbitrary letter
a - letter 'a'
\p{L}{3} - exactly 3 arbitrary letters
g - letter 'g'
$ - anchor, word ending
然后從字典中獲取與此模式匹配的所有單詞:
代碼:
using System.Linq;
using System.Text.RegularExpressions;
...
private static string[] Variants(string mask, IEnumerable<string> availableWords) {
Regex regex = new Regex("^" Regex.Replace(mask, "#*", m => @$"\p{{L}}{{{m.Length}}}") "$");
return availableWords
.Where(word => regex.IsMatch(availableWords))
.OrderBy(word => word)
.ToArray();
}
演示:
string[] allWords = new [] {
"quick",
"brown",
"fox",
"jump",
"rating",
"coding"
"lazy",
"paring",
"fang",
"dog",
};
string[] variants = Variants("#a###g", allWords);
Console.Write(string.Join(Environment.NewLine, variants));
結果:
paring
rating
uj5u.com熱心網友回復:
我需要在索引 1 處為“a”、索引 5 處為“g”的串列中找到一個單詞,如下所示
wordList.Where(word => word.Length == 6 && word[1] == 'a' && word[5] == 'g')
首先長度檢查對于防止崩潰至關重要,除非您的單詞按長度排列到不同的串列中。
如果您的意思是您實際上將"#a###g"作為傳達搜索詞的引數傳遞:
var term = "#a###g";
var search = term.Select((c,i) => (Chr:c,Idx:i)).Where(t => t.Chr != '#').ToArray();
var words = wordList.Where(word => word.Length == term.Length && search.All(t => word[t.Idx] == t.Chr));
這個怎么運作:
- 取“#a###g”并將其投影到字符索引和字符本身的序列中,因此
('#', 0),('a', 1),('#', 2),('#', 3),('#', 4),('g', 5) - 丟棄
'#',只留下('a', 1),('g', 5) - 這意味著“'a' 在位置 1 和 'g' 在 5”
- 搜索詞表,要求字長是一樣的“#A ### G”,并且也是所有搜索條件匹配時,我們“得到了焦炭出了
word在Idx并檢查它匹配Chr的搜索詞
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/360046.html
下一篇:如何根據運算式撰寫條件?
