2016-11-20 4 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

감사합니다 이브라힘! 나는 그걸로 일하고 내가 성취 할 수있는 것을 보게 될 것이다. 편집 해 주셔서 감사합니다. btw, 많은 감사를드립니다! – CoffeeGuy

+0

@ user6305383 스택 오버플로에 오신 것을 환영합니다. – 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

이 정규 표현식은 모두 'lions','dogs' 및'gods'와 모두 일치합니다. 아마도 문자열 끝에 대한 마지막'$ '가 추가되어야합니다. 질문의 * "한 번만"* 일부는 정규 표현식으로 달성하기가 매우 어렵습니다. – AdrianHHH

0

을이을 시도 일을 몇 가지 예제 알고리즘은하십시오. 나는 두 개의 문자열이 함께 텍스트의 모든 글자를 취할 필요가 없다고 생각했다. 또한 처음 두 가지 대답을 반환합니다.

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

이 알고리즘 기능입니다 : 여기 는 외부 기능, Main 또는 다른 사람에 호출 방법이다. 모든 문자열 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 인 두 매개 변수를 추가하는 경우 호출 함수에서 결과를 확인해야합니다.

관련 문제