2016-09-07 1 views
1

У меня есть головоломка, где игрокам нужно сделать столько слов, сколько они могут, используя буквы существующего 9-буквенного слова. Скажем, у вас есть «водопад». Принимая письма и переставляя, вы можете сделать wafer, недостаток, левый ect.Regex найти слова из множества букв

В настоящее время, я использую выражение, которое выглядит, как это на моем списке слов:

^(?:([waterfall])(?!.*?1)){1,9}$ 

Но проблема в том, что это позволяет также письма, которые только появляются один раз, чтобы использовать дважды, как бесплатные (три Es) и tatter (три Ts).

На данный момент я просто повторяю свой список слов и подсчитываю буквы, убедившись, что предлагаемое слово не содержит более высокое количество на письмо, чем мое исходное слово. Но это кажется немного утомительным, и мое чувство кишки говорит мне, что должно быть возможным гарантировать, что выражение фактически использует только каждую букву один раз (или дважды, как L, если оно находится в начале слова дважды).

Я просмотрел документацию, но для меня это довольно греческий вопрос, и мне было интересно, есть ли у прекрасных укладчиков предложение.

+1

Только для пояснения: '[водопад]' не ищет слова 'водопад', а вместо этого допускает одну букву класса символов. Его можно даже переписать как '[aeflrtw]' и разрешить те же слова (это, к сожалению, не решает вашу проблему: =)) То, что вы ищете, называется ** перестановкой **. – Jan

+0

Какой диалект regex вы используете? – bwoebi

+2

Я не думаю, что регулярное выражение подходит для этого - вам нужно будет проверить правильное количество каждой буквы в отдельном окне, например ['^ (?! (. * W) {2}) (?! (. * а) {3}) (?! (. * т) {2}) (?! (. * е) {2}) (?! (. * г) {2}) (?! (. * f) {2}) (?! (. * l) {3}) [waterfl] + $ '] (https://regex101.com/r/fW3rK4/1) для вашего примера. –

ответ

3

Вы не должны использовать регулярное выражение для него, это будет ад для поддержки или генерации пользовательского регулярного выражения каждый раз. Вы можете использовать этот метод:

public static bool checker(string big, string small) 
{ 
    Dictionary<char, int> letterCount = new Dictionary<char, int>(); 
    foreach (char c in big) 
    { 
     if (!letterCount.ContainsKey(c)) 
     { 
      letterCount[c] = 0; 
     } 
     letterCount[c]++; 
    } 
    return small.All(letter => letterCount.ContainsKey(letter) && --letterCount[letter] >= 0); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^