查找给定字符串的所有子序列
Find all subsequences of given string
我有一个字符串(不包含换行符),我想找到第一个字符串中另一个字符串的所有子序列。
例如,假设我要查找的字符串是"hello world"
。如果我在这个字符串中搜索(使用正则表达式):"1h2e3l4l5o6 7w8o9r0l0d0"
,它应该能够发现它确实包含(一次)字符串 "hello world"
。它还应该能够在以下字符串中找到多个匹配项:"hheelloo wwoorrlldd"
.
我有以下代码:
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
是 "hheelloo wwoorrlldd"
,那么这个正则表达式只能找到一个匹配项,这是错误的。
关于如何解决这个问题的任何想法?
当然你不能找到一个以上的结果,原因有二
- 您只搜索一个字符(
h
而不是 h*
)。
- 您根本没有任何匹配的组
您可以将此站点用作正则表达式的测试区:https://regex101.com/r/uT8eS0/1
首先,如果你想拥有多个匹配项,你必须定义匹配组。否则你只会一直得到一场比赛。您也在搜索 h
时搜索单个字符。如果要匹配多个,则必须将其更改为 h*
或 h+
。如果您决定 +
它匹配一个到无限个字符。如果你使用 *
它将匹配零到无限个字符。
将您的模式更改为 "h+.*e+.*l+.*l+.*o+.* .*w+.*o+.*r+.*l+.*d+
也将匹配您发布的模式中字符之间的字符,因为它们在 .*
指令中处理。 Afaik 不可能只在一个字符串中匹配不同的组。您可以将组或子组中的每个字符分开,但这会导致大量不同的组。
如果使用 .NET 正则表达式,您将不会有任何运气。你最好的选择是为它编写一个算法。正则表达式不是完成这项工作的正确工具。
就是说,您可以 使用 PCRE 正则表达式执行此操作,而我这样做只是为了好玩 ;)
Disclaimer: I'm the author of the library I used in this post.
首先,安装 PCRE.NET:
Install-Package PCRE.NET
然后,构建一个这样的模式:
h.*?e.*?l.*?l.*?o.*?\ .*?w.*?o.*?r.*?l.*?d(?C1)
那个 (?C1)
东西在 PCRE 的说法中叫做 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 wwoorrlldd")
returns 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#。正则表达式语法的关键是 pattern{min,max};你增加最小值并让最大值尽可能贪婪。所以我寻找一个 h,接着是一个 e,然后是一个 l,然后是另一个 l,然后是一个 o。如果我找到所有,我会寻找 2 h、2 e、2 l、2 more l 和 2 o……你明白了。
现在,如果您想增强此功能并获得更多匹配,只需在字符串中向前移动一个字母并重新运行匹配。
你可以玩一会,效率高吗?不知道:)
看看类似问题的解决方案(在javascript中,但很容易理解)。
我有一个字符串(不包含换行符),我想找到第一个字符串中另一个字符串的所有子序列。
例如,假设我要查找的字符串是"hello world"
。如果我在这个字符串中搜索(使用正则表达式):"1h2e3l4l5o6 7w8o9r0l0d0"
,它应该能够发现它确实包含(一次)字符串 "hello world"
。它还应该能够在以下字符串中找到多个匹配项:"hheelloo wwoorrlldd"
.
我有以下代码:
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
是 "hheelloo wwoorrlldd"
,那么这个正则表达式只能找到一个匹配项,这是错误的。
关于如何解决这个问题的任何想法?
当然你不能找到一个以上的结果,原因有二
- 您只搜索一个字符(
h
而不是h*
)。 - 您根本没有任何匹配的组
您可以将此站点用作正则表达式的测试区:https://regex101.com/r/uT8eS0/1
首先,如果你想拥有多个匹配项,你必须定义匹配组。否则你只会一直得到一场比赛。您也在搜索 h
时搜索单个字符。如果要匹配多个,则必须将其更改为 h*
或 h+
。如果您决定 +
它匹配一个到无限个字符。如果你使用 *
它将匹配零到无限个字符。
将您的模式更改为 "h+.*e+.*l+.*l+.*o+.* .*w+.*o+.*r+.*l+.*d+
也将匹配您发布的模式中字符之间的字符,因为它们在 .*
指令中处理。 Afaik 不可能只在一个字符串中匹配不同的组。您可以将组或子组中的每个字符分开,但这会导致大量不同的组。
如果使用 .NET 正则表达式,您将不会有任何运气。你最好的选择是为它编写一个算法。正则表达式不是完成这项工作的正确工具。
就是说,您可以 使用 PCRE 正则表达式执行此操作,而我这样做只是为了好玩 ;)
Disclaimer: I'm the author of the library I used in this post.
首先,安装 PCRE.NET:
Install-Package PCRE.NET
然后,构建一个这样的模式:
h.*?e.*?l.*?l.*?o.*?\ .*?w.*?o.*?r.*?l.*?d(?C1)
那个 (?C1)
东西在 PCRE 的说法中叫做 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 wwoorrlldd")
returns 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#。正则表达式语法的关键是 pattern{min,max};你增加最小值并让最大值尽可能贪婪。所以我寻找一个 h,接着是一个 e,然后是一个 l,然后是另一个 l,然后是一个 o。如果我找到所有,我会寻找 2 h、2 e、2 l、2 more l 和 2 o……你明白了。
现在,如果您想增强此功能并获得更多匹配,只需在字符串中向前移动一个字母并重新运行匹配。
你可以玩一会,效率高吗?不知道:)
看看类似问题的