다른 문자열의 문자가 들어있는 두 개의 문자열 (순서가 맞지 않은 문자열)을 찾아야합니다.정규식 목록에서 두 문자열 찾기
lion
dog
bear
cat
그리고 주어진 문자열은 다음과 같습니다 : oodilgn
이 명확하게하기 위해, 예는 같은 동물의 목록이 될 수 있습니다. 여기
대답은 다음과 같습니다 문자열에서 lion
및 dog
각 문자는 한 번만 사용됩니다.
정규식을 사용하면이 작업을 수행 할 수 있습니까?
다른 문자열의 문자가 들어있는 두 개의 문자열 (순서가 맞지 않은 문자열)을 찾아야합니다.정규식 목록에서 두 문자열 찾기
lion
dog
bear
cat
그리고 주어진 문자열은 다음과 같습니다 : oodilgn
이 명확하게하기 위해, 예는 같은 동물의 목록이 될 수 있습니다. 여기
대답은 다음과 같습니다 문자열에서 lion
및 dog
각 문자는 한 번만 사용됩니다.
정규식을 사용하면이 작업을 수행 할 수 있습니까?
주어진 문자열을 []
사이에 넣으십시오. 이 대괄호는이 서신에서만 - 순서에 관계없이 - 선택할 수 있습니다. 이것은 완벽한 해결책은 아니지만 목록의 대부분을 잡을 것입니다.
예를 들어, oodilgn
이 [oodilgn]
로, 다음 문자의 최소 수를 찾을 수에 추가 쓸 수 있습니다 -의 3을 가정 해 봅시다 - 중괄호 {}
를 사용하여. 전체 정규식은 다음과 같이 될 것입니다 :
[oodilgn]{3,}
이 코드는 기본적으로 말한다 : 임의의 순서로 괄호 사이에 위치하는 문자 셋이있는 단어를 찾을 수 있습니다.
여기
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"];
을이을 시도 일을 몇 가지 예제 알고리즘은하십시오. 나는 두 개의 문자열이 함께 텍스트의 모든 글자를 취할 필요가 없다고 생각했다. 또한 처음 두 가지 대답을 반환합니다.
다음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}");
}
}
기능이 최적화되어 있지만 원하는대로 작동하지 않습니다. 결과를 반환하려면 인쇄하지 말고 배열을 만들고 firstWord
및 secondWord
을 넣고 반환 유형이 string[]
이거나 ref out
인 두 매개 변수를 추가하는 경우 호출 함수에서 결과를 확인해야합니다.
이것은 C# + Linq를 사용하여 수행 할 수 있습니다. 정규식을 사용하는 특별한 이유가 있습니까? – Damith
정규식을 만들 수도 있지만 추악 할 것입니다. 이를 해결하기위한보다 쉬운 프로그래밍 방식이 있습니다. – Bohemian
* 문자열의 각 문자는 한 단어 또는 모든 단어에 대해 한 번만 사용됩니다. – Jim