2016-11-20 117 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在這些情況下,您將需要檢查調用函數的結果。

相關問題