I have a string such as \"big bad dog\", how can I get an string[] array which includes all the possible word/phrase combinations?
So, I would like to return \"big\"
What about splitting the string into array of separate words
string str = "big fat dog";
string[] words = str.Split(new Char[] { ' ', ',', '.', ':', '\t' });
and then you can use this to make word combinations
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); }
I think regular expresion has no use here.
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);
}
EDIT: No, it can not be done using only a single regular expression.
EDIT: Per Eric Lippert, change masks to ulong (UInt64).
I think this is a nice problem to solve recursively. My take:
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")
returns your list of phrases.
Edit: Edited to only include consecutive phrases.