2016-11-20 35 views
0

我需要在包含另一个字符串中的字符的列表中找到两个字符串,这些字符串不是按顺序排列的。要清楚,一个例子可以是动物,如清单:使用正则表达式在列表中查找两个字符串

lion 
dog 
bear 
cat 

和给定的字符串是:oodilgn

的这里的答案是:liondog

从字符串中的每个字符将只能使用一次。

有没有一个正则表达式可以让我做到这一点?

+0

这可以用c#+ Linq完成,你有具体的理由使用正则表达式吗? – Damith

+1

你可以构建一个正则表达式,但它会很难看。有更简单的方法来解决这个问题。 – Bohemian

+0

*字符串中的每个字符将只用于一次* ...每个单词或所有单词? – Jim

回答

0

您可以尝试将给定的字符串放在[]之间。这些括号将允许只从这些字母中选择 - 以任何顺序。这可能不是一个完美的解决方案,但它会吸引你的大部分名单。

例如,你可以写oodilgn[oodilgn],再加入被发现的字母最小数目 - 比方说3 - 通过使用大括号{}。完整的正则表达式将是这样的:

[oodilgn]{3,} 

此代码基本上说:发现有三所位于任何顺序括号中的字母的任何单词。

演示:https://regex101.com/r/MCWHjQ/2

+0

谢谢易卜拉欣!我会和它一起工作,看看我能做些什么。感谢编辑,顺便说一句,非常感谢! – CoffeeGuy

+0

@ user6305383我的荣幸,欢迎来到Stack Overflow。 – Ibrahim

+0

*字符串中的每个字符将仅用于一次*说OP – Jim

0

请试试这个

Regex r=new Regex("^[.*oodilgn]$"); 
     var list=new List<String>(){"lion","dog","fish","god"}; 
     var output=list.Where(x=>r.IsMatch(x)); 

结果

output=["lion","dog","god"]; 
+0

确保实现所需的库'regularexpression' 和'Linq' –

+0

*字符串中的每个字符将仅用于一次*说OP – Jim

+0

这个正则表达式还将匹配所有的“狮子”,“狗”和“神”。也许应该添加一个字符串末尾的最后一个'$'。 *“只有一次”*部分问题很难用正则表达式实现。 – AdrianHHH

0

这里是做这项工作的一些例子算法。我假定两个字符串不需要从文本中取出所有字母,否则我会进行额外的注释检查。我还回到前两个合适的答案。 这里是你如何把它在外面的功能,Main要不然:

static void Main(string[] args) 
{ 
    var text = "oodilgn"; 
    var listOfWords = new List<string> { "lion", "dog", "bear", "cat" }; 
    ExtractWordsWithSameLetters(text, listOfWords); 
} 

下面是该算法的功能。所有的字符串manuplations完全与正则表达式。

public static void ExtractWordsWithSameLetters(string text, List<string> listOfWords) 
    { 
     string firstWord = null; 
     string secondWord = null; 
     for (var i = 0; i < listOfWords.Count - 1; i++) 
     { 
      var textCopy = text; 
      var firstWordIsMatched = true; 
      foreach (var letter in listOfWords[i]) 
      { 
       var pattern = $"(.*?)({letter})(.*?)"; 
       var regex = new Regex(pattern); 
       if (regex.IsMatch(text)) 
       { 
        textCopy = regex.Replace(textCopy, "$1*$3", 1); 
       } 
       else 
       { 
        firstWordIsMatched = false; 
        break; 
       } 
      } 

      if (!firstWordIsMatched) 
      { 
       continue; 
      } 
      firstWord = listOfWords[i]; 

      for (var j = i + 1; j < listOfWords.Count; j++) 
      { 
       var secondWordIsMatched = true; 
       foreach (var letter in listOfWords[j]) 
       { 
        var pattern = $"(.*?)({letter})(.*?)"; 
        var regex = new Regex(pattern); 
        if (regex.IsMatch(text)) 
        { 
         textCopy = regex.Replace(textCopy, "$1*$3", 1); 
        } 
        else 
        { 
         secondWordIsMatched = false; 
         break; 
        } 
       } 
       if (secondWordIsMatched) 
       { 
        secondWord = listOfWords[j]; 
        break; 
       } 
      } 

      if (secondWord == null) 
      { 
       firstWord = null; 
      } 
      else 
      { 
       //if (textCopy.ToCharArray().Any(l => l != '*')) 
       //{ 
       // break; 
       //} 
       break; 
      } 
     } 

     if (firstWord != null) 
     { 
      Console.WriteLine($"{firstWord} { secondWord}"); 
     } 
    } 

功能远没有优化,但做你想做的。如果你想返回结果,不打印他们只是创建一个数组和firstWordsecondWord它的东西,并返回类型string[]或添加两个参数ref out在这些情况下,您将需要检查调用函数的结果。

相关问题