Создать массив словосочетаний в c # - PullRequest
5 голосов
/ 08 марта 2010

У меня есть строка, такая как "big bad dog", как я могу получить массив string [], который включает в себя все возможные комбинации слов / фраз?

Итак, я хотел бы вернуть «большой», «плохой», «собака», «большой плохой», «плохой собака» и «большой плохой собака» - поэтому порядок слов в исходной строке должен быть уважаемая.

Это можно сделать с помощью регулярного выражения?

Ответы [ 3 ]

6 голосов
/ 08 марта 2010

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

public static String[] findWords(params string[] args)
{

        if (args.Count() == 0)
        {
            return new String[] { "" };
        }
        else
        {
            String[] oldWords = findWords(args.Skip(1).ToArray());
            String[] newWords = oldWords.Where(word => word == "" || word.Split(new String[] { " " }, StringSplitOptions.RemoveEmptyEntries)[0] == args[1])
                                        .Select(word => (args[0] + " " + word).Trim()).ToArray();

            return oldWords.Union(newWords).ToArray();
        }
} 

A findWords("big", "bad", "dog") возвращает ваш список фраз.

Редактировать: Редактируется, чтобы включать только последовательные фразы.

6 голосов
/ 08 марта 2010
string[] array = new string[]{"big", "bad", "dog"};
for(ulong mask = 0; mask < (1ul << array.Length); mask++)
{
    string permutation = "";
    for(int i = 0; i < array.Length;  i++)
    {
        if((mask & (1ul << (array.Length - 1 - i))) != 0)
        {
            permutation += array[i] + " ";
        }
    }
    Console.WriteLine(permutation);
}

РЕДАКТИРОВАТЬ: Нет, это нельзя сделать, используя только одно регулярное выражение.

РЕДАКТИРОВАТЬ: В соответствии с Эрик Липперт, изменить маски на Улонг (UInt64).

0 голосов
/ 08 марта 2010

Как насчет разбиения строки на массив отдельных слов

string str = "big fat dog";
string[] words = str.Split(new Char[] { ' ', ',', '.', ':', '\t' });

и затем вы можете использовать это, чтобы составлять словосочетания

string[] words = new string[]{"big", "bad", "dog"}; 
for(int mask = 0; mask < 1 << (words.Length); mask++) 
{ 
  string permutation = ""; 
  for(int i = 0; i < words.Length;  i++) 
  { 
    if((mask & (1 << (words.Length - 1 - i))) != 0) 
    { 
      permutation += words[i] + " "; 
    } 
  } 
  Console.WriteLine(permutation); 
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...