我需要在包含另一個字符串中的字符的列表中找到兩個字符串,這些字符串不是按順序排列的。要清楚,一個例子可以是動物,如清單:使用正則表達式在列表中查找兩個字符串
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"];
這裏是做這項工作的一些例子算法。我假定兩個字符串不需要從文本中取出所有字母,否則我會進行額外的註釋檢查。我還回到前兩個合適的答案。 這裏是你如何把它在外面的功能,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}");
}
}
功能遠沒有優化,但做你想做的。如果你想返回結果,不打印他們只是創建一個數組和firstWord
和secondWord
它的東西,並返回類型string[]
或添加兩個參數ref out
在這些情況下,您將需要檢查調用函數的結果。
這可以用c#+ Linq完成,你有具體的理由使用正則表達式嗎? – Damith
你可以構建一個正則表達式,但它會很難看。有更簡單的方法來解決這個問題。 – Bohemian
*字符串中的每個字符將只用於一次* ...每個單詞或所有單詞? – Jim