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