【问题标题】:Generate word combination array in c#在c#中生成单词组合数组
【发布时间】:2010-03-08 13:24:06
【问题描述】:

我有一个字符串,例如“big bad dog”,我怎样才能得到一个包含所有可能的单词/短语组合的 string[] 数组?

所以,我想返回“big”、“bad”、“dog”、“big bad”、“bad dog”和“big bad dog”——因此原始字符串中单词的顺序必须是尊重。

这可以用正则表达式完成吗?

【问题讨论】:

  • “大狗”呢?因为它仍然保留了顺序,但忽略了中间词。
  • 我最近做了一个“类似蛮力”的例程,它确实做到了这一点,但带有字母。它不使用正则表达式,或者我会在这里发布
  • 当你学习正则表达式时,一切看起来都像钉子......
  • 关于“大狗”的观点很好,但不应该算在内。我想更好的表达方式是我需要所有连续的单词/短语。

标签: c# regex


【解决方案1】:

我认为这是一个递归解决的好问题。我的看法:

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();
        }
} 

findWords("big", "bad", "dog") 返回您的短语列表。

编辑:编辑为仅包含连续的短语。

【讨论】:

  • 这解决了问题,但没有完全回答 OP 的问题。
  • 感谢 Jens,这正是我想要的。只有一个小问题(我在原始帖子中没有解释),那就是我只想要连续的单词或短语,所以“大狗”不应该是匹配的。您可以对代码进行调整吗?
  • @Stuart:已编辑。但它失去了优雅 =)
  • 嗨@Jen,太好了。非常感谢。希望我的感激之情能弥补代码优雅的损失! :)
【解决方案2】:
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);
}

编辑:不,它不能只使用一个正则表达式来完成。

编辑:根据 Eric Lippert,将掩码更改为 ulong (UInt64)。

【讨论】:

  • 这解决了问题,但没有完全回答 OP 的问题。
  • 如果超过 32 个单词怎么办? (我知道,通过前 40 亿需要一段时间,但现在机器速度很快。)
【解决方案3】:

如何将字符串拆分为单独的单词数组

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); 
}

我认为正则表达式在这里没有用。

【讨论】:

  • 这解决了问题,但没有完全回答 OP 的问题。
猜你喜欢
  • 2011-09-14
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2019-02-13
相关资源
最近更新 更多