C# 查找给定字符串的所有子序列
我有一个字符串(不包含换行符),我想找到第一个字符串中另一个字符串的所有子序列 例如,假设我要查找的字符串是C# 查找给定字符串的所有子序列,c#,regex,subsequence,C#,Regex,Subsequence,我有一个字符串(不包含换行符),我想找到第一个字符串中另一个字符串的所有子序列 例如,假设我要查找的字符串是“hello world”。如果我在以下字符串中搜索(使用正则表达式):“1h2e3l4l5o6 7w8o9r0l0d0”,它应该能够发现它确实包含(一次)字符串“hello world”。它还应该能够在以下字符串中找到多个匹配项:“hheelloo wwoorrldd” 我有以下代码: string stringToSearch = // could be anything (no ne
“hello world”
。如果我在以下字符串中搜索(使用正则表达式):“1h2e3l4l5o6 7w8o9r0l0d0”
,它应该能够发现它确实包含(一次)字符串“hello world”
。它还应该能够在以下字符串中找到多个匹配项:“hheelloo wwoorrldd”
我有以下代码:
string stringToSearch = // could be anything (no newline)
int numOfSubSeq = 0;
Regex myRegex = new Regex("h.*e.*l.*l.*o.* .*w.*o.*r.*l.*d");
MatchCollection matches = myRegex.Matches(stringToSearch);
numOfSubSeq = matches.Count; // I only need the number of matches
这很有效。某种程度上。如果stringToSearch
是“1h2e3l4l5o6 7w8o9r0l0d0”
,它工作正常。但是,如果stringToSearch
是“hheelloowwoorrldd”
,那么这个正则表达式只能找到一个匹配项,这是错误的
关于如何解决这个问题,你有什么想法吗?当然,由于两个原因,你只能找到一个结果
- 您只搜索一个字符(
,而不是h
)h*
- 您根本没有任何匹配的组
h
时,您也在搜索单个字符。如果要匹配多个,必须将其更改为h*
或h+
。如果您决定使用+
,它将匹配一到无限个字符。如果您选择*
,它将匹配零到无限字符
将模式更改为
“h+.*e+.*l+.*l+.*o+.*w+.*o+.*r+.*l+.*d+
也将匹配之间的字符,因为它们是在*
指令中在您发布的模式中的字符之间处理的。好吧,不可能只在一个字符串中匹配不同的组。您可以将一个组或子组中的每个字符分开,但这将导致大量不同的组。使用.NET正则表达式时,您不会有任何运气。你最好的办法是为它写一个算法。正则表达式不是适合这项工作的工具
也就是说,你可以用PCRE正则表达式来做这件事,我这样做只是为了好玩;)
免责声明:我是我在本文中使用的库的作者
首先,安装:
然后,构建如下模式:
h.*?e.*?l.*?l.*?o.*?\ .*?w.*?o.*?r.*?l.*?d(?C1)
在PCRE的说法中,(?C1)
这个东西被称为调用。它指示正则表达式引擎在此匹配点调用您的自定义函数。然后,您可以说该部分是否应被视为匹配
计算调用callout函数的次数,并告诉引擎该模式应该失败,这将迫使它回溯。工作完成了
public static int GetMatchCount(string searchFor, string searchIn)
{
if (string.IsNullOrEmpty(searchFor) || string.IsNullOrEmpty(searchIn))
return 0;
var patternBuilder = new StringBuilder();
foreach (var searchChar in searchFor)
patternBuilder.Append(Regex.Escape(searchChar.ToString())).Append(".*?");
patternBuilder.Length -= 3;
patternBuilder.Append("(?C1)");
var pattern = new PcreRegex(patternBuilder.ToString());
var count = 0;
pattern.Match(searchIn, callout =>
{
++count;
return PcreCalloutResult.Fail;
});
return count;
}
调用GetMatchCount(“hello world”,“hheelloo wwoorrrlldd”)
返回512
哦,顺便说一句,如果你想知道字符在输入字符串中的位置,这里有一些代码:
public static void PrintMatches(string searchFor, string searchIn)
{
if (string.IsNullOrEmpty(searchFor) || string.IsNullOrEmpty(searchIn))
return;
var patternBuilder = new StringBuilder();
foreach (var searchChar in searchFor)
patternBuilder.Append("(").Append(Regex.Escape(searchChar.ToString())).Append(").*?");
patternBuilder.Length -= 3;
patternBuilder.Append("(?C1)");
var pattern = new PcreRegex(patternBuilder.ToString());
var outputBuilder = new StringBuilder();
Console.WriteLine(searchIn);
pattern.Match(searchIn, callout =>
{
outputBuilder.Clear();
outputBuilder.Append(' ', searchIn.Length);
foreach (var group in callout.Match.Groups.Skip(1))
outputBuilder[group.Index] = '^';
Console.WriteLine(outputBuilder);
return PcreCalloutResult.Fail;
});
}
结果如下:
hheelloo wwoorrlldd
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^^ ^ ^ ^ ^ ^^
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^ ^^
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^ ^^
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^ ^^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^^ ^
^ ^ ^^^ ^ ^^ ^^ ^
^ ^ ^^^ ^ ^^ ^ ^^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^ ^^
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^^ ^^ ^ ^ ^ ^
^ ^ ^^^ ^^ ^ ^ ^ ^
^ ^ ^^^ ^^ ^ ^ ^^
^ ^ ^^^ ^^ ^ ^ ^ ^
^ ^ ^^^ ^^ ^ ^^ ^
^ ^ ^^^ ^^ ^ ^^ ^
^ ^ ^^^ ^^ ^ ^ ^^
^ ^ ^^^ ^^ ^ ^ ^ ^
^ ^ ^^^ ^^ ^^ ^ ^
^ ^ ^^^ ^^ ^^ ^ ^
^ ^ ^^^ ^^ ^^ ^^
^ ^ ^^^ ^^ ^^ ^ ^
^ ^ ^^^ ^^ ^ ^^ ^
^ ^ ^^^ ^^ ^ ^^ ^
^ ^ ^^^ ^^ ^ ^ ^^
^ ^ ^^^ ^^ ^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^ ^^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^^ ^^ ^
^ ^ ^^^ ^ ^^ ^^ ^
^ ^ ^^^ ^ ^^ ^ ^^
^ ^ ^^^ ^ ^^ ^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^^ ^^
^ ^ ^^^ ^ ^ ^^ ^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^^ ^
^ ^ ^^^ ^ ^ ^ ^ ^^
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^ ^ ^ ^^
^ ^ ^^ ^^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^ ^ ^^ ^
^ ^ ^^ ^^ ^ ^ ^^ ^
^ ^ ^^ ^^ ^ ^ ^ ^^
^ ^ ^^ ^^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^ ^^ ^ ^
^ ^ ^^ ^^ ^ ^^ ^ ^
^ ^ ^^ ^^ ^ ^^ ^^
^ ^ ^^ ^^ ^ ^^ ^ ^
^ ^ ^^ ^^ ^ ^ ^^ ^
^ ^ ^^ ^^ ^ ^ ^^ ^
^ ^ ^^ ^^ ^ ^ ^ ^^
^ ^ ^^ ^^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^^ ^ ^ ^
^ ^ ^^ ^^ ^^ ^ ^ ^
^ ^ ^^ ^^ ^^ ^ ^^
^ ^ ^^ ^^ ^^ ^ ^ ^
^ ^ ^^ ^^ ^^ ^^ ^
^ ^ ^^ ^^ ^^ ^^ ^
^ ^ ^^ ^^ ^^ ^ ^^
^ ^ ^^ ^^ ^^ ^ ^ ^
^ ^ ^^ ^^ ^ ^^ ^ ^
^ ^ ^^ ^^ ^ ^^ ^ ^
^ ^ ^^ ^^ ^ ^^ ^^
^ ^ ^^ ^^ ^ ^^ ^ ^
^ ^ ^^ ^^ ^ ^ ^^ ^
^ ^ ^^ ^^ ^ ^ ^^ ^
^ ^ ^^ ^^ ^ ^ ^ ^^
^ ^ ^^ ^^ ^ ^ ^ ^ ^
^ ^ ^^ ^ ^^ ^ ^ ^ ^
^ ^ ^^ ^ ^^ ^ ^ ^ ^
^ ^ ^^ ^ ^^ ^ ^ ^^
^ ^ ^^ ^ ^^ ^ ^ ^ ^
^ ^ ^^ ^ ^^ ^ ^^ ^
^ ^ ^^ ^ ^^ ^ ^^ ^
^ ^ ^^ ^ ^^ ^ ^ ^^
^ ^ ^^ ^ ^^ ^ ^ ^ ^
^ ^ ^^ ^ ^^ ^^ ^ ^
^ ^ ^^ ^ ^^ ^^ ^ ^
^ ^ ^^ ^ ^^ ^^ ^^
^ ^ ^^ ^ ^^ ^^ ^ ^
^ ^ ^^ ^ ^^ ^ ^^ ^
^ ^ ^^ ^ ^^ ^ ^^ ^
^ ^ ^^ ^ ^^ ^ ^ ^^
^ ^ ^^ ^ ^^ ^ ^ ^ ^
^ ^ ^^ ^ ^ ^^ ^ ^ ^
^ ^ ^^ ^ ^ ^^ ^ ^ ^
^ ^ ^^ ^ ^ ^^ ^ ^^
^ ^ ^^ ^ ^ ^^ ^ ^ ^
^ ^ ^^ ^ ^ ^^ ^^ ^
^ ^ ^^ ^ ^ ^^ ^^ ^
^ ^ ^^ ^ ^ ^^ ^ ^^
^ ^ ^^ ^ ^ ^^ ^ ^ ^
^ ^ ^^ ^ ^ ^ ^^ ^ ^
^ ^ ^^ ^ ^ ^ ^^ ^ ^
^ ^ ^^ ^ ^ ^ ^^ ^^
^ ^ ^^ ^ ^ ^ ^^ ^ ^
^ ^ ^^ ^ ^ ^ ^ ^^ ^
^ ^ ^^ ^ ^ ^ ^ ^^ ^
^ ^ ^^ ^ ^ ^ ^ ^ ^^
^ ^ ^^ ^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^ ^^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^ ^^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^^ ^ ^
^ ^^^^ ^^ ^^ ^ ^
^ ^^^^ ^^ ^^ ^^
^ ^^^^ ^^ ^^ ^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^ ^^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^^ ^ ^^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^^ ^^ ^
^ ^^^ ^^ ^^ ^^ ^
^ ^^^ ^^ ^^ ^ ^^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^ ^^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^ ^^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^^ ^ ^
^ ^^^ ^ ^^ ^^ ^ ^
^ ^^^ ^ ^^ ^^ ^^
^ ^^^ ^ ^^ ^^ ^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^ ^^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^ ^^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^^ ^
^ ^^^ ^ ^ ^^ ^^ ^
^ ^^^ ^ ^ ^^ ^ ^^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^ ^^ ^ ^
^ ^^^ ^ ^ ^ ^^ ^ ^
^ ^^^ ^ ^ ^ ^^ ^^
^ ^^^ ^ ^ ^ ^^ ^ ^
^ ^^^ ^ ^ ^ ^ ^^ ^
^ ^^^ ^ ^ ^ ^ ^^ ^
^ ^^^ ^ ^ ^ ^ ^ ^^
^ ^^^ ^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^ ^ ^ ^ ^^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^ ^^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^^ ^^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^ ^^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^^ ^ ^^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^^ ^^ ^
^^ ^^^ ^ ^^ ^^ ^
^^ ^^^ ^ ^^ ^ ^^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^^ ^^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^ ^^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^^ ^^ ^ ^ ^ ^
^^ ^^^ ^^ ^ ^ ^ ^
^^ ^^^ ^^ ^ ^ ^^
^^ ^^^ ^^ ^ ^ ^ ^
^^ ^^^ ^^ ^ ^^ ^
^^ ^^^ ^^ ^ ^^ ^
^^ ^^^ ^^ ^ ^ ^^
^^ ^^^ ^^ ^ ^ ^ ^
^^ ^^^ ^^ ^^ ^ ^
^^ ^^^ ^^ ^^ ^ ^
^^ ^^^ ^^ ^^ ^^
^^ ^^^ ^^ ^^ ^ ^
^^ ^^^ ^^ ^ ^^ ^
^^ ^^^ ^^ ^ ^^ ^
^^ ^^^ ^^ ^ ^ ^^
^^ ^^^ ^^ ^ ^ ^ ^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^^ ^ ^^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^^ ^^ ^
^^ ^^^ ^ ^^ ^^ ^
^^ ^^^ ^ ^^ ^ ^^
^^ ^^^ ^ ^^ ^ ^ ^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^^ ^^
^^ ^^^ ^ ^ ^^ ^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^^ ^
^^ ^^^ ^ ^ ^ ^ ^^
^^ ^^^ ^ ^ ^ ^ ^ ^
^^ ^^ ^^ ^ ^ ^ ^ ^
^^ ^^ ^^ ^ ^ ^ ^ ^
^^ ^^ ^^ ^ ^ ^ ^^
^^ ^^ ^^ ^ ^ ^ ^ ^
^^ ^^ ^^ ^ ^ ^^ ^
^^ ^^ ^^ ^ ^ ^^ ^
^^ ^^ ^^ ^ ^ ^ ^^
^^ ^^ ^^ ^ ^ ^ ^ ^
^^ ^^ ^^ ^ ^^ ^ ^
^^ ^^ ^^ ^ ^^ ^ ^
^^ ^^ ^^ ^ ^^ ^^
^^ ^^ ^^ ^ ^^ ^ ^
^^ ^^ ^^ ^ ^ ^^ ^
^^ ^^ ^^ ^ ^ ^^ ^
^^ ^^ ^^ ^ ^ ^ ^^
^^ ^^ ^^ ^ ^ ^ ^ ^
^^ ^^ ^^ ^^ ^ ^ ^
^^ ^^ ^^ ^^ ^ ^ ^
^^ ^^ ^^ ^^ ^ ^^
^^ ^^ ^^ ^^ ^ ^ ^
^^ ^^ ^^ ^^ ^^ ^
^^ ^^ ^^ ^^ ^^ ^
^^ ^^ ^^ ^^ ^ ^^
^^ ^^ ^^ ^^ ^ ^ ^
^^ ^^ ^^ ^ ^^ ^ ^
^^ ^^ ^^ ^ ^^ ^ ^
^^ ^^ ^^ ^ ^^ ^^
^^ ^^ ^^ ^ ^^ ^ ^
^^ ^^ ^^ ^ ^ ^^ ^
^^ ^^ ^^ ^ ^ ^^ ^
^^ ^^ ^^ ^ ^ ^ ^^
^^ ^^ ^^ ^ ^ ^ ^ ^
^^ ^^ ^ ^^ ^ ^ ^ ^
^^ ^^ ^ ^^ ^ ^ ^ ^
^^ ^^ ^ ^^ ^ ^ ^^
^^ ^^ ^ ^^ ^ ^ ^ ^
^^ ^^ ^ ^^ ^ ^^ ^
^^ ^^ ^ ^^ ^ ^^ ^
^^ ^^ ^ ^^ ^ ^ ^^
^^ ^^ ^ ^^ ^ ^ ^ ^
^^ ^^ ^ ^^ ^^ ^ ^
^^ ^^ ^ ^^ ^^ ^ ^
^^ ^^ ^ ^^ ^^ ^^
^^ ^^ ^ ^^ ^^ ^ ^
^^ ^^ ^ ^^ ^ ^^ ^
^^ ^^ ^ ^^ ^ ^^ ^
^^ ^^ ^ ^^ ^ ^ ^^
^^ ^^ ^ ^^ ^ ^ ^ ^
^^ ^^ ^ ^ ^^ ^ ^ ^
^^ ^^ ^ ^ ^^ ^ ^ ^
^^ ^^ ^ ^ ^^ ^ ^^
^^ ^^ ^ ^ ^^ ^ ^ ^
^^ ^^ ^ ^ ^^ ^^ ^
^^ ^^ ^ ^ ^^ ^^ ^
^^ ^^ ^ ^ ^^ ^ ^^
^^ ^^ ^ ^ ^^ ^ ^ ^
^^ ^^ ^ ^ ^ ^^ ^ ^
^^ ^^ ^ ^ ^ ^^ ^ ^
^^ ^^ ^ ^ ^ ^^ ^^
^^ ^^ ^ ^ ^ ^^ ^ ^
^^ ^^ ^ ^ ^ ^ ^^ ^
^^ ^^ ^ ^ ^ ^ ^^ ^
^^ ^^ ^ ^ ^ ^ ^ ^^
^^ ^^ ^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^ ^^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^ ^^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^^ ^^ ^ ^
^ ^^^^ ^^ ^^ ^ ^
^ ^^^^ ^^ ^^ ^^
^ ^^^^ ^^ ^^ ^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^^ ^
^ ^^^^ ^^ ^ ^ ^^
^ ^^^^ ^^ ^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^^ ^
^ ^^^^ ^ ^^ ^ ^^
^ ^^^^ ^ ^^ ^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^^ ^^
^ ^^^^ ^ ^ ^^ ^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^^ ^
^ ^^^^ ^ ^ ^ ^ ^^
^ ^^^^ ^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^^ ^ ^^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^^ ^^ ^
^ ^^^ ^^ ^^ ^^ ^
^ ^^^ ^^ ^^ ^ ^^
^ ^^^ ^^ ^^ ^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^^ ^^
^ ^^^ ^^ ^ ^^ ^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^^ ^
^ ^^^ ^^ ^ ^ ^ ^^
^ ^^^ ^^ ^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^ ^^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^ ^^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^^ ^^ ^ ^
^ ^^^ ^ ^^ ^^ ^ ^
^ ^^^ ^ ^^ ^^ ^^
^ ^^^ ^ ^^ ^^ ^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^^ ^
^ ^^^ ^ ^^ ^ ^ ^^
^ ^^^ ^ ^^ ^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^ ^^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^^ ^^ ^
^ ^^^ ^ ^ ^^ ^^ ^
^ ^^^ ^ ^ ^^ ^ ^^
^ ^^^ ^ ^ ^^ ^ ^ ^
^ ^^^ ^ ^ ^ ^^ ^ ^
^ ^^^ ^ ^ ^ ^^ ^ ^
^ ^^^ ^ ^ ^ ^^ ^^
^ ^^^ ^ ^ ^ ^^ ^ ^
^ ^^^ ^ ^ ^ ^ ^^ ^
^ ^^^ ^ ^ ^ ^ ^^ ^
^ ^^^ ^ ^ ^ ^ ^ ^^
^ ^^^ ^ ^ ^ ^ ^ ^ ^
我知道,我本应该用C#写这个,但我用PERL写了出来,因为它也知道正则表达式;而且现在更容易了
$_ = "hheelllloo";
sub matchmaker {
my @blah = @_;
if ($blah[0] =~ /[h]{$blah[1],}[e]{$blah[1],}[l]{$blah[1],}[l]{$blah[1],}[o]{$blah[1],}/) {
$blah[1]++;
print("deeper\n");
matchmaker($blah[0],$blah[1]);
} else {
return $blah[1]-1;
}
}
$match = matchmaker($_,1);
print("match ",$match);
如果您愿意,它是一个递归函数,它查看字符串并要求越来越多的字母匹配您要求的模式。你可以在5分钟内把它转换成c。键是表示模式{min,max}的正则表达式语法;增加最小值,让最大值尽可能贪婪。所以我寻找一个h,然后是一个e,然后是一个l,而不是另一个l,而不是一个o。如果我找到了所有的,我会寻找2个h,2个e,2个l,2个更多的l和2个o。。。你明白了
现在,如果您想增强此函数,并获得更多匹配项,可以向前移动字符串中的一个字母,然后重新运行匹配项
你可以玩一会儿,它是否有效。不知道:)看看类似问题的解决方案(用javascript编写,但很容易理解)。对不起。我刚刚加了一个标签。C#Regex不会匹配重叠的匹配,因此如果将
aa
与aaa
匹配,则只会得到一个匹配。在您的示例中也是如此。顺便问一下,您希望hheelloowwoorrldd
有多少个匹配项?两个或256个?这只是一个想法,但如果你可以使用循环,你可以:从初始字符串中减去字符并循环,直到没有更多的命中,或者每个字符迭代。@tobias_k我的目标是找到所有可能的匹配项。Swift与这个问题有什么关系?还是Perl?OP要求一个C#解决方案。是的,你的权利,我没有读对。改变了它,卢卡斯。我还在努力识别你在说什么语言:C,C++,Perl,Swift……C,它在我现在看到的评论中。这个方法的时间复杂度是多少?
$_ = "hheelllloo";
sub matchmaker {
my @blah = @_;
if ($blah[0] =~ /[h]{$blah[1],}[e]{$blah[1],}[l]{$blah[1],}[l]{$blah[1],}[o]{$blah[1],}/) {
$blah[1]++;
print("deeper\n");
matchmaker($blah[0],$blah[1]);
} else {
return $blah[1]-1;
}
}
$match = matchmaker($_,1);
print("match ",$match);