【问题标题】:Find all subsequences of given string查找给定字符串的所有子序列
【发布时间】:2016-03-20 19:18:00
【问题描述】:

我有一个字符串(不包含换行符),我想查找第一个字符串中的另一个字符串的所有子序列。

例如,假设我要查找的字符串是"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",那么这个正则表达式只能找到一个匹配项,这是错误的。

关于如何解决此问题的任何想法?

【问题讨论】:

  • 对不起。我刚刚添加了一个标签。 C#
  • 正则表达式不会匹配重叠的匹配,所以如果你匹配 aaaaa 你只会得到一个匹配。在您的示例中也是如此。
  • 顺便说一句,您希望hheelloo wwoorrlldd 有多少匹配项?两个,还是 256 个?
  • 只是一个想法,但如果您可以使用循环,您可以:从初始字符串中减去字符并循环直到找不到更多匹配项,或者每个字符进行迭代。
  • @tobias_k 我的目标是找到所有可能的匹配项。

标签: c# regex subsequence


【解决方案1】:

使用 .NET 正则表达式你不会有任何运气。你最好的选择是为它写一个算法。正则表达式不是适合这项工作的工具。

也就是说,您可以使用 PCRE 正则表达式来做到这一点,而我这样做只是为了好玩 ;)

免责声明:我是我在这篇文章中使用的库的作者。

首先,安装PCRE.NET

Install-Package PCRE.NET

然后,构建一个这样的模式:

h.*?e.*?l.*?l.*?o.*?\ .*?w.*?o.*?r.*?l.*?d(?C1)

(?C1) 的东西在 PCRE 用语中称为 标注。它指示正则表达式引擎在匹配时调用您的自定义函数。然后,您可以说该部分是否应被视为匹配。

计算调用调用函数的次数,并告诉引擎模式应该失败,这将迫使它回溯。任务完成。

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") 返回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
^ ^ ^^^ ^ ^ ^ ^ ^ ^
^ ^ ^^^ ^ ^ ^ ^ ^  ^
^ ^ ^^^ ^ ^ ^ ^  ^^
^ ^ ^^^ ^ ^ ^ ^  ^ ^
^ ^ ^^^ ^ ^ ^  ^^ ^
^ ^ ^^^ ^ ^ ^  ^^  ^
^ ^ ^^^ ^ ^ ^  ^ ^^
^ ^ ^^^ ^ ^ ^  ^ ^ ^
^ ^ ^^^ ^ ^  ^^ ^ ^
^ ^ ^^^ ^ ^  ^^ ^  ^
^ ^ ^^^ ^ ^  ^^  ^^
^ ^ ^^^ ^ ^  ^^  ^ ^
^ ^ ^^^ ^ ^  ^ ^^ ^
^ ^ ^^^ ^ ^  ^ ^^  ^
^ ^ ^^^ ^ ^  ^ ^ ^^
^ ^ ^^^ ^ ^  ^ ^ ^ ^
^ ^ ^^^ ^  ^^ ^ ^ ^
^ ^ ^^^ ^  ^^ ^ ^  ^
^ ^ ^^^ ^  ^^ ^  ^^
^ ^ ^^^ ^  ^^ ^  ^ ^
^ ^ ^^^ ^  ^^  ^^ ^
^ ^ ^^^ ^  ^^  ^^  ^
^ ^ ^^^ ^  ^^  ^ ^^
^ ^ ^^^ ^  ^^  ^ ^ ^
^ ^ ^^^ ^  ^ ^^ ^ ^
^ ^ ^^^ ^  ^ ^^ ^  ^
^ ^ ^^^ ^  ^ ^^  ^^
^ ^ ^^^ ^  ^ ^^  ^ ^
^ ^ ^^^ ^  ^ ^ ^^ ^
^ ^ ^^^ ^  ^ ^ ^^  ^
^ ^ ^^^ ^  ^ ^ ^ ^^
^ ^ ^^^ ^  ^ ^ ^ ^ ^
^ ^ ^^^  ^^ ^ ^ ^ ^
^ ^ ^^^  ^^ ^ ^ ^  ^
^ ^ ^^^  ^^ ^ ^  ^^
^ ^ ^^^  ^^ ^ ^  ^ ^
^ ^ ^^^  ^^ ^  ^^ ^
^ ^ ^^^  ^^ ^  ^^  ^
^ ^ ^^^  ^^ ^  ^ ^^
^ ^ ^^^  ^^ ^  ^ ^ ^
^ ^ ^^^  ^^  ^^ ^ ^
^ ^ ^^^  ^^  ^^ ^  ^
^ ^ ^^^  ^^  ^^  ^^
^ ^ ^^^  ^^  ^^  ^ ^
^ ^ ^^^  ^^  ^ ^^ ^
^ ^ ^^^  ^^  ^ ^^  ^
^ ^ ^^^  ^^  ^ ^ ^^
^ ^ ^^^  ^^  ^ ^ ^ ^
^ ^ ^^^  ^ ^^ ^ ^ ^
^ ^ ^^^  ^ ^^ ^ ^  ^
^ ^ ^^^  ^ ^^ ^  ^^
^ ^ ^^^  ^ ^^ ^  ^ ^
^ ^ ^^^  ^ ^^  ^^ ^
^ ^ ^^^  ^ ^^  ^^  ^
^ ^ ^^^  ^ ^^  ^ ^^
^ ^ ^^^  ^ ^^  ^ ^ ^
^ ^ ^^^  ^ ^ ^^ ^ ^
^ ^ ^^^  ^ ^ ^^ ^  ^
^ ^ ^^^  ^ ^ ^^  ^^
^ ^ ^^^  ^ ^ ^^  ^ ^
^ ^ ^^^  ^ ^ ^ ^^ ^
^ ^ ^^^  ^ ^ ^ ^^  ^
^ ^ ^^^  ^ ^ ^ ^ ^^
^ ^ ^^^  ^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^ ^ ^ ^ ^
^ ^ ^^ ^^ ^ ^ ^ ^  ^
^ ^ ^^ ^^ ^ ^ ^  ^^
^ ^ ^^ ^^ ^ ^ ^  ^ ^
^ ^ ^^ ^^ ^ ^  ^^ ^
^ ^ ^^ ^^ ^ ^  ^^  ^
^ ^ ^^ ^^ ^ ^  ^ ^^
^ ^ ^^ ^^ ^ ^  ^ ^ ^
^ ^ ^^ ^^ ^  ^^ ^ ^
^ ^ ^^ ^^ ^  ^^ ^  ^
^ ^ ^^ ^^ ^  ^^  ^^
^ ^ ^^ ^^ ^  ^^  ^ ^
^ ^ ^^ ^^ ^  ^ ^^ ^
^ ^ ^^ ^^ ^  ^ ^^  ^
^ ^ ^^ ^^ ^  ^ ^ ^^
^ ^ ^^ ^^ ^  ^ ^ ^ ^
^ ^ ^^ ^^  ^^ ^ ^ ^
^ ^ ^^ ^^  ^^ ^ ^  ^
^ ^ ^^ ^^  ^^ ^  ^^
^ ^ ^^ ^^  ^^ ^  ^ ^
^ ^ ^^ ^^  ^^  ^^ ^
^ ^ ^^ ^^  ^^  ^^  ^
^ ^ ^^ ^^  ^^  ^ ^^
^ ^ ^^ ^^  ^^  ^ ^ ^
^ ^ ^^ ^^  ^ ^^ ^ ^
^ ^ ^^ ^^  ^ ^^ ^  ^
^ ^ ^^ ^^  ^ ^^  ^^
^ ^ ^^ ^^  ^ ^^  ^ ^
^ ^ ^^ ^^  ^ ^ ^^ ^
^ ^ ^^ ^^  ^ ^ ^^  ^
^ ^ ^^ ^^  ^ ^ ^ ^^
^ ^ ^^ ^^  ^ ^ ^ ^ ^
^ ^ ^^ ^ ^^ ^ ^ ^ ^
^ ^ ^^ ^ ^^ ^ ^ ^  ^
^ ^ ^^ ^ ^^ ^ ^  ^^
^ ^ ^^ ^ ^^ ^ ^  ^ ^
^ ^ ^^ ^ ^^ ^  ^^ ^
^ ^ ^^ ^ ^^ ^  ^^  ^
^ ^ ^^ ^ ^^ ^  ^ ^^
^ ^ ^^ ^ ^^ ^  ^ ^ ^
^ ^ ^^ ^ ^^  ^^ ^ ^
^ ^ ^^ ^ ^^  ^^ ^  ^
^ ^ ^^ ^ ^^  ^^  ^^
^ ^ ^^ ^ ^^  ^^  ^ ^
^ ^ ^^ ^ ^^  ^ ^^ ^
^ ^ ^^ ^ ^^  ^ ^^  ^
^ ^ ^^ ^ ^^  ^ ^ ^^
^ ^ ^^ ^ ^^  ^ ^ ^ ^
^ ^ ^^ ^ ^ ^^ ^ ^ ^
^ ^ ^^ ^ ^ ^^ ^ ^  ^
^ ^ ^^ ^ ^ ^^ ^  ^^
^ ^ ^^ ^ ^ ^^ ^  ^ ^
^ ^ ^^ ^ ^ ^^  ^^ ^
^ ^ ^^ ^ ^ ^^  ^^  ^
^ ^ ^^ ^ ^ ^^  ^ ^^
^ ^ ^^ ^ ^ ^^  ^ ^ ^
^ ^ ^^ ^ ^ ^ ^^ ^ ^
^ ^ ^^ ^ ^ ^ ^^ ^  ^
^ ^ ^^ ^ ^ ^ ^^  ^^
^ ^ ^^ ^ ^ ^ ^^  ^ ^
^ ^ ^^ ^ ^ ^ ^ ^^ ^
^ ^ ^^ ^ ^ ^ ^ ^^  ^
^ ^ ^^ ^ ^ ^ ^ ^ ^^
^ ^ ^^ ^ ^ ^ ^ ^ ^ ^
^  ^^^^ ^ ^ ^ ^ ^ ^
^  ^^^^ ^ ^ ^ ^ ^  ^
^  ^^^^ ^ ^ ^ ^  ^^
^  ^^^^ ^ ^ ^ ^  ^ ^
^  ^^^^ ^ ^ ^  ^^ ^
^  ^^^^ ^ ^ ^  ^^  ^
^  ^^^^ ^ ^ ^  ^ ^^
^  ^^^^ ^ ^ ^  ^ ^ ^
^  ^^^^ ^ ^  ^^ ^ ^
^  ^^^^ ^ ^  ^^ ^  ^
^  ^^^^ ^ ^  ^^  ^^
^  ^^^^ ^ ^  ^^  ^ ^
^  ^^^^ ^ ^  ^ ^^ ^
^  ^^^^ ^ ^  ^ ^^  ^
^  ^^^^ ^ ^  ^ ^ ^^
^  ^^^^ ^ ^  ^ ^ ^ ^
^  ^^^^ ^  ^^ ^ ^ ^
^  ^^^^ ^  ^^ ^ ^  ^
^  ^^^^ ^  ^^ ^  ^^
^  ^^^^ ^  ^^ ^  ^ ^
^  ^^^^ ^  ^^  ^^ ^
^  ^^^^ ^  ^^  ^^  ^
^  ^^^^ ^  ^^  ^ ^^
^  ^^^^ ^  ^^  ^ ^ ^
^  ^^^^ ^  ^ ^^ ^ ^
^  ^^^^ ^  ^ ^^ ^  ^
^  ^^^^ ^  ^ ^^  ^^
^  ^^^^ ^  ^ ^^  ^ ^
^  ^^^^ ^  ^ ^ ^^ ^
^  ^^^^ ^  ^ ^ ^^  ^
^  ^^^^ ^  ^ ^ ^ ^^
^  ^^^^ ^  ^ ^ ^ ^ ^
^  ^^^^  ^^ ^ ^ ^ ^
^  ^^^^  ^^ ^ ^ ^  ^
^  ^^^^  ^^ ^ ^  ^^
^  ^^^^  ^^ ^ ^  ^ ^
^  ^^^^  ^^ ^  ^^ ^
^  ^^^^  ^^ ^  ^^  ^
^  ^^^^  ^^ ^  ^ ^^
^  ^^^^  ^^ ^  ^ ^ ^
^  ^^^^  ^^  ^^ ^ ^
^  ^^^^  ^^  ^^ ^  ^
^  ^^^^  ^^  ^^  ^^
^  ^^^^  ^^  ^^  ^ ^
^  ^^^^  ^^  ^ ^^ ^
^  ^^^^  ^^  ^ ^^  ^
^  ^^^^  ^^  ^ ^ ^^
^  ^^^^  ^^  ^ ^ ^ ^
^  ^^^^  ^ ^^ ^ ^ ^
^  ^^^^  ^ ^^ ^ ^  ^
^  ^^^^  ^ ^^ ^  ^^
^  ^^^^  ^ ^^ ^  ^ ^
^  ^^^^  ^ ^^  ^^ ^
^  ^^^^  ^ ^^  ^^  ^
^  ^^^^  ^ ^^  ^ ^^
^  ^^^^  ^ ^^  ^ ^ ^
^  ^^^^  ^ ^ ^^ ^ ^
^  ^^^^  ^ ^ ^^ ^  ^
^  ^^^^  ^ ^ ^^  ^^
^  ^^^^  ^ ^ ^^  ^ ^
^  ^^^^  ^ ^ ^ ^^ ^
^  ^^^^  ^ ^ ^ ^^  ^
^  ^^^^  ^ ^ ^ ^ ^^
^  ^^^^  ^ ^ ^ ^ ^ ^
^  ^^^ ^^ ^ ^ ^ ^ ^
^  ^^^ ^^ ^ ^ ^ ^  ^
^  ^^^ ^^ ^ ^ ^  ^^
^  ^^^ ^^ ^ ^ ^  ^ ^
^  ^^^ ^^ ^ ^  ^^ ^
^  ^^^ ^^ ^ ^  ^^  ^
^  ^^^ ^^ ^ ^  ^ ^^
^  ^^^ ^^ ^ ^  ^ ^ ^
^  ^^^ ^^ ^  ^^ ^ ^
^  ^^^ ^^ ^  ^^ ^  ^
^  ^^^ ^^ ^  ^^  ^^
^  ^^^ ^^ ^  ^^  ^ ^
^  ^^^ ^^ ^  ^ ^^ ^
^  ^^^ ^^ ^  ^ ^^  ^
^  ^^^ ^^ ^  ^ ^ ^^
^  ^^^ ^^ ^  ^ ^ ^ ^
^  ^^^ ^^  ^^ ^ ^ ^
^  ^^^ ^^  ^^ ^ ^  ^
^  ^^^ ^^  ^^ ^  ^^
^  ^^^ ^^  ^^ ^  ^ ^
^  ^^^ ^^  ^^  ^^ ^
^  ^^^ ^^  ^^  ^^  ^
^  ^^^ ^^  ^^  ^ ^^
^  ^^^ ^^  ^^  ^ ^ ^
^  ^^^ ^^  ^ ^^ ^ ^
^  ^^^ ^^  ^ ^^ ^  ^
^  ^^^ ^^  ^ ^^  ^^
^  ^^^ ^^  ^ ^^  ^ ^
^  ^^^ ^^  ^ ^ ^^ ^
^  ^^^ ^^  ^ ^ ^^  ^
^  ^^^ ^^  ^ ^ ^ ^^
^  ^^^ ^^  ^ ^ ^ ^ ^
^  ^^^ ^ ^^ ^ ^ ^ ^
^  ^^^ ^ ^^ ^ ^ ^  ^
^  ^^^ ^ ^^ ^ ^  ^^
^  ^^^ ^ ^^ ^ ^  ^ ^
^  ^^^ ^ ^^ ^  ^^ ^
^  ^^^ ^ ^^ ^  ^^  ^
^  ^^^ ^ ^^ ^  ^ ^^
^  ^^^ ^ ^^ ^  ^ ^ ^
^  ^^^ ^ ^^  ^^ ^ ^
^  ^^^ ^ ^^  ^^ ^  ^
^  ^^^ ^ ^^  ^^  ^^
^  ^^^ ^ ^^  ^^  ^ ^
^  ^^^ ^ ^^  ^ ^^ ^
^  ^^^ ^ ^^  ^ ^^  ^
^  ^^^ ^ ^^  ^ ^ ^^
^  ^^^ ^ ^^  ^ ^ ^ ^
^  ^^^ ^ ^ ^^ ^ ^ ^
^  ^^^ ^ ^ ^^ ^ ^  ^
^  ^^^ ^ ^ ^^ ^  ^^
^  ^^^ ^ ^ ^^ ^  ^ ^
^  ^^^ ^ ^ ^^  ^^ ^
^  ^^^ ^ ^ ^^  ^^  ^
^  ^^^ ^ ^ ^^  ^ ^^
^  ^^^ ^ ^ ^^  ^ ^ ^
^  ^^^ ^ ^ ^ ^^ ^ ^
^  ^^^ ^ ^ ^ ^^ ^  ^
^  ^^^ ^ ^ ^ ^^  ^^
^  ^^^ ^ ^ ^ ^^  ^ ^
^  ^^^ ^ ^ ^ ^ ^^ ^
^  ^^^ ^ ^ ^ ^ ^^  ^
^  ^^^ ^ ^ ^ ^ ^ ^^
^  ^^^ ^ ^ ^ ^ ^ ^ ^
 ^^ ^^^ ^ ^ ^ ^ ^ ^
 ^^ ^^^ ^ ^ ^ ^ ^  ^
 ^^ ^^^ ^ ^ ^ ^  ^^
 ^^ ^^^ ^ ^ ^ ^  ^ ^
 ^^ ^^^ ^ ^ ^  ^^ ^
 ^^ ^^^ ^ ^ ^  ^^  ^
 ^^ ^^^ ^ ^ ^  ^ ^^
 ^^ ^^^ ^ ^ ^  ^ ^ ^
 ^^ ^^^ ^ ^  ^^ ^ ^
 ^^ ^^^ ^ ^  ^^ ^  ^
 ^^ ^^^ ^ ^  ^^  ^^
 ^^ ^^^ ^ ^  ^^  ^ ^
 ^^ ^^^ ^ ^  ^ ^^ ^
 ^^ ^^^ ^ ^  ^ ^^  ^
 ^^ ^^^ ^ ^  ^ ^ ^^
 ^^ ^^^ ^ ^  ^ ^ ^ ^
 ^^ ^^^ ^  ^^ ^ ^ ^
 ^^ ^^^ ^  ^^ ^ ^  ^
 ^^ ^^^ ^  ^^ ^  ^^
 ^^ ^^^ ^  ^^ ^  ^ ^
 ^^ ^^^ ^  ^^  ^^ ^
 ^^ ^^^ ^  ^^  ^^  ^
 ^^ ^^^ ^  ^^  ^ ^^
 ^^ ^^^ ^  ^^  ^ ^ ^
 ^^ ^^^ ^  ^ ^^ ^ ^
 ^^ ^^^ ^  ^ ^^ ^  ^
 ^^ ^^^ ^  ^ ^^  ^^
 ^^ ^^^ ^  ^ ^^  ^ ^
 ^^ ^^^ ^  ^ ^ ^^ ^
 ^^ ^^^ ^  ^ ^ ^^  ^
 ^^ ^^^ ^  ^ ^ ^ ^^
 ^^ ^^^ ^  ^ ^ ^ ^ ^
 ^^ ^^^  ^^ ^ ^ ^ ^
 ^^ ^^^  ^^ ^ ^ ^  ^
 ^^ ^^^  ^^ ^ ^  ^^
 ^^ ^^^  ^^ ^ ^  ^ ^
 ^^ ^^^  ^^ ^  ^^ ^
 ^^ ^^^  ^^ ^  ^^  ^
 ^^ ^^^  ^^ ^  ^ ^^
 ^^ ^^^  ^^ ^  ^ ^ ^
 ^^ ^^^  ^^  ^^ ^ ^
 ^^ ^^^  ^^  ^^ ^  ^
 ^^ ^^^  ^^  ^^  ^^
 ^^ ^^^  ^^  ^^  ^ ^
 ^^ ^^^  ^^  ^ ^^ ^
 ^^ ^^^  ^^  ^ ^^  ^
 ^^ ^^^  ^^  ^ ^ ^^
 ^^ ^^^  ^^  ^ ^ ^ ^
 ^^ ^^^  ^ ^^ ^ ^ ^
 ^^ ^^^  ^ ^^ ^ ^  ^
 ^^ ^^^  ^ ^^ ^  ^^
 ^^ ^^^  ^ ^^ ^  ^ ^
 ^^ ^^^  ^ ^^  ^^ ^
 ^^ ^^^  ^ ^^  ^^  ^
 ^^ ^^^  ^ ^^  ^ ^^
 ^^ ^^^  ^ ^^  ^ ^ ^
 ^^ ^^^  ^ ^ ^^ ^ ^
 ^^ ^^^  ^ ^ ^^ ^  ^
 ^^ ^^^  ^ ^ ^^  ^^
 ^^ ^^^  ^ ^ ^^  ^ ^
 ^^ ^^^  ^ ^ ^ ^^ ^
 ^^ ^^^  ^ ^ ^ ^^  ^
 ^^ ^^^  ^ ^ ^ ^ ^^
 ^^ ^^^  ^ ^ ^ ^ ^ ^
 ^^ ^^ ^^ ^ ^ ^ ^ ^
 ^^ ^^ ^^ ^ ^ ^ ^  ^
 ^^ ^^ ^^ ^ ^ ^  ^^
 ^^ ^^ ^^ ^ ^ ^  ^ ^
 ^^ ^^ ^^ ^ ^  ^^ ^
 ^^ ^^ ^^ ^ ^  ^^  ^
 ^^ ^^ ^^ ^ ^  ^ ^^
 ^^ ^^ ^^ ^ ^  ^ ^ ^
 ^^ ^^ ^^ ^  ^^ ^ ^
 ^^ ^^ ^^ ^  ^^ ^  ^
 ^^ ^^ ^^ ^  ^^  ^^
 ^^ ^^ ^^ ^  ^^  ^ ^
 ^^ ^^ ^^ ^  ^ ^^ ^
 ^^ ^^ ^^ ^  ^ ^^  ^
 ^^ ^^ ^^ ^  ^ ^ ^^
 ^^ ^^ ^^ ^  ^ ^ ^ ^
 ^^ ^^ ^^  ^^ ^ ^ ^
 ^^ ^^ ^^  ^^ ^ ^  ^
 ^^ ^^ ^^  ^^ ^  ^^
 ^^ ^^ ^^  ^^ ^  ^ ^
 ^^ ^^ ^^  ^^  ^^ ^
 ^^ ^^ ^^  ^^  ^^  ^
 ^^ ^^ ^^  ^^  ^ ^^
 ^^ ^^ ^^  ^^  ^ ^ ^
 ^^ ^^ ^^  ^ ^^ ^ ^
 ^^ ^^ ^^  ^ ^^ ^  ^
 ^^ ^^ ^^  ^ ^^  ^^
 ^^ ^^ ^^  ^ ^^  ^ ^
 ^^ ^^ ^^  ^ ^ ^^ ^
 ^^ ^^ ^^  ^ ^ ^^  ^
 ^^ ^^ ^^  ^ ^ ^ ^^
 ^^ ^^ ^^  ^ ^ ^ ^ ^
 ^^ ^^ ^ ^^ ^ ^ ^ ^
 ^^ ^^ ^ ^^ ^ ^ ^  ^
 ^^ ^^ ^ ^^ ^ ^  ^^
 ^^ ^^ ^ ^^ ^ ^  ^ ^
 ^^ ^^ ^ ^^ ^  ^^ ^
 ^^ ^^ ^ ^^ ^  ^^  ^
 ^^ ^^ ^ ^^ ^  ^ ^^
 ^^ ^^ ^ ^^ ^  ^ ^ ^
 ^^ ^^ ^ ^^  ^^ ^ ^
 ^^ ^^ ^ ^^  ^^ ^  ^
 ^^ ^^ ^ ^^  ^^  ^^
 ^^ ^^ ^ ^^  ^^  ^ ^
 ^^ ^^ ^ ^^  ^ ^^ ^
 ^^ ^^ ^ ^^  ^ ^^  ^
 ^^ ^^ ^ ^^  ^ ^ ^^
 ^^ ^^ ^ ^^  ^ ^ ^ ^
 ^^ ^^ ^ ^ ^^ ^ ^ ^
 ^^ ^^ ^ ^ ^^ ^ ^  ^
 ^^ ^^ ^ ^ ^^ ^  ^^
 ^^ ^^ ^ ^ ^^ ^  ^ ^
 ^^ ^^ ^ ^ ^^  ^^ ^
 ^^ ^^ ^ ^ ^^  ^^  ^
 ^^ ^^ ^ ^ ^^  ^ ^^
 ^^ ^^ ^ ^ ^^  ^ ^ ^
 ^^ ^^ ^ ^ ^ ^^ ^ ^
 ^^ ^^ ^ ^ ^ ^^ ^  ^
 ^^ ^^ ^ ^ ^ ^^  ^^
 ^^ ^^ ^ ^ ^ ^^  ^ ^
 ^^ ^^ ^ ^ ^ ^ ^^ ^
 ^^ ^^ ^ ^ ^ ^ ^^  ^
 ^^ ^^ ^ ^ ^ ^ ^ ^^
 ^^ ^^ ^ ^ ^ ^ ^ ^ ^
 ^ ^^^^ ^ ^ ^ ^ ^ ^
 ^ ^^^^ ^ ^ ^ ^ ^  ^
 ^ ^^^^ ^ ^ ^ ^  ^^
 ^ ^^^^ ^ ^ ^ ^  ^ ^
 ^ ^^^^ ^ ^ ^  ^^ ^
 ^ ^^^^ ^ ^ ^  ^^  ^
 ^ ^^^^ ^ ^ ^  ^ ^^
 ^ ^^^^ ^ ^ ^  ^ ^ ^
 ^ ^^^^ ^ ^  ^^ ^ ^
 ^ ^^^^ ^ ^  ^^ ^  ^
 ^ ^^^^ ^ ^  ^^  ^^
 ^ ^^^^ ^ ^  ^^  ^ ^
 ^ ^^^^ ^ ^  ^ ^^ ^
 ^ ^^^^ ^ ^  ^ ^^  ^
 ^ ^^^^ ^ ^  ^ ^ ^^
 ^ ^^^^ ^ ^  ^ ^ ^ ^
 ^ ^^^^ ^  ^^ ^ ^ ^
 ^ ^^^^ ^  ^^ ^ ^  ^
 ^ ^^^^ ^  ^^ ^  ^^
 ^ ^^^^ ^  ^^ ^  ^ ^
 ^ ^^^^ ^  ^^  ^^ ^
 ^ ^^^^ ^  ^^  ^^  ^
 ^ ^^^^ ^  ^^  ^ ^^
 ^ ^^^^ ^  ^^  ^ ^ ^
 ^ ^^^^ ^  ^ ^^ ^ ^
 ^ ^^^^ ^  ^ ^^ ^  ^
 ^ ^^^^ ^  ^ ^^  ^^
 ^ ^^^^ ^  ^ ^^  ^ ^
 ^ ^^^^ ^  ^ ^ ^^ ^
 ^ ^^^^ ^  ^ ^ ^^  ^
 ^ ^^^^ ^  ^ ^ ^ ^^
 ^ ^^^^ ^  ^ ^ ^ ^ ^
 ^ ^^^^  ^^ ^ ^ ^ ^
 ^ ^^^^  ^^ ^ ^ ^  ^
 ^ ^^^^  ^^ ^ ^  ^^
 ^ ^^^^  ^^ ^ ^  ^ ^
 ^ ^^^^  ^^ ^  ^^ ^
 ^ ^^^^  ^^ ^  ^^  ^
 ^ ^^^^  ^^ ^  ^ ^^
 ^ ^^^^  ^^ ^  ^ ^ ^
 ^ ^^^^  ^^  ^^ ^ ^
 ^ ^^^^  ^^  ^^ ^  ^
 ^ ^^^^  ^^  ^^  ^^
 ^ ^^^^  ^^  ^^  ^ ^
 ^ ^^^^  ^^  ^ ^^ ^
 ^ ^^^^  ^^  ^ ^^  ^
 ^ ^^^^  ^^  ^ ^ ^^
 ^ ^^^^  ^^  ^ ^ ^ ^
 ^ ^^^^  ^ ^^ ^ ^ ^
 ^ ^^^^  ^ ^^ ^ ^  ^
 ^ ^^^^  ^ ^^ ^  ^^
 ^ ^^^^  ^ ^^ ^  ^ ^
 ^ ^^^^  ^ ^^  ^^ ^
 ^ ^^^^  ^ ^^  ^^  ^
 ^ ^^^^  ^ ^^  ^ ^^
 ^ ^^^^  ^ ^^  ^ ^ ^
 ^ ^^^^  ^ ^ ^^ ^ ^
 ^ ^^^^  ^ ^ ^^ ^  ^
 ^ ^^^^  ^ ^ ^^  ^^
 ^ ^^^^  ^ ^ ^^  ^ ^
 ^ ^^^^  ^ ^ ^ ^^ ^
 ^ ^^^^  ^ ^ ^ ^^  ^
 ^ ^^^^  ^ ^ ^ ^ ^^
 ^ ^^^^  ^ ^ ^ ^ ^ ^
 ^ ^^^ ^^ ^ ^ ^ ^ ^
 ^ ^^^ ^^ ^ ^ ^ ^  ^
 ^ ^^^ ^^ ^ ^ ^  ^^
 ^ ^^^ ^^ ^ ^ ^  ^ ^
 ^ ^^^ ^^ ^ ^  ^^ ^
 ^ ^^^ ^^ ^ ^  ^^  ^
 ^ ^^^ ^^ ^ ^  ^ ^^
 ^ ^^^ ^^ ^ ^  ^ ^ ^
 ^ ^^^ ^^ ^  ^^ ^ ^
 ^ ^^^ ^^ ^  ^^ ^  ^
 ^ ^^^ ^^ ^  ^^  ^^
 ^ ^^^ ^^ ^  ^^  ^ ^
 ^ ^^^ ^^ ^  ^ ^^ ^
 ^ ^^^ ^^ ^  ^ ^^  ^
 ^ ^^^ ^^ ^  ^ ^ ^^
 ^ ^^^ ^^ ^  ^ ^ ^ ^
 ^ ^^^ ^^  ^^ ^ ^ ^
 ^ ^^^ ^^  ^^ ^ ^  ^
 ^ ^^^ ^^  ^^ ^  ^^
 ^ ^^^ ^^  ^^ ^  ^ ^
 ^ ^^^ ^^  ^^  ^^ ^
 ^ ^^^ ^^  ^^  ^^  ^
 ^ ^^^ ^^  ^^  ^ ^^
 ^ ^^^ ^^  ^^  ^ ^ ^
 ^ ^^^ ^^  ^ ^^ ^ ^
 ^ ^^^ ^^  ^ ^^ ^  ^
 ^ ^^^ ^^  ^ ^^  ^^
 ^ ^^^ ^^  ^ ^^  ^ ^
 ^ ^^^ ^^  ^ ^ ^^ ^
 ^ ^^^ ^^  ^ ^ ^^  ^
 ^ ^^^ ^^  ^ ^ ^ ^^
 ^ ^^^ ^^  ^ ^ ^ ^ ^
 ^ ^^^ ^ ^^ ^ ^ ^ ^
 ^ ^^^ ^ ^^ ^ ^ ^  ^
 ^ ^^^ ^ ^^ ^ ^  ^^
 ^ ^^^ ^ ^^ ^ ^  ^ ^
 ^ ^^^ ^ ^^ ^  ^^ ^
 ^ ^^^ ^ ^^ ^  ^^  ^
 ^ ^^^ ^ ^^ ^  ^ ^^
 ^ ^^^ ^ ^^ ^  ^ ^ ^
 ^ ^^^ ^ ^^  ^^ ^ ^
 ^ ^^^ ^ ^^  ^^ ^  ^
 ^ ^^^ ^ ^^  ^^  ^^
 ^ ^^^ ^ ^^  ^^  ^ ^
 ^ ^^^ ^ ^^  ^ ^^ ^
 ^ ^^^ ^ ^^  ^ ^^  ^
 ^ ^^^ ^ ^^  ^ ^ ^^
 ^ ^^^ ^ ^^  ^ ^ ^ ^
 ^ ^^^ ^ ^ ^^ ^ ^ ^
 ^ ^^^ ^ ^ ^^ ^ ^  ^
 ^ ^^^ ^ ^ ^^ ^  ^^
 ^ ^^^ ^ ^ ^^ ^  ^ ^
 ^ ^^^ ^ ^ ^^  ^^ ^
 ^ ^^^ ^ ^ ^^  ^^  ^
 ^ ^^^ ^ ^ ^^  ^ ^^
 ^ ^^^ ^ ^ ^^  ^ ^ ^
 ^ ^^^ ^ ^ ^ ^^ ^ ^
 ^ ^^^ ^ ^ ^ ^^ ^  ^
 ^ ^^^ ^ ^ ^ ^^  ^^
 ^ ^^^ ^ ^ ^ ^^  ^ ^
 ^ ^^^ ^ ^ ^ ^ ^^ ^
 ^ ^^^ ^ ^ ^ ^ ^^  ^
 ^ ^^^ ^ ^ ^ ^ ^ ^^
 ^ ^^^ ^ ^ ^ ^ ^ ^ ^

【讨论】:

    【解决方案2】:

    当然,由于两个原因,您只能找到一个结果

    • 您只搜索一个字符(h 而不是h*)。
    • 您根本没有任何匹配的组

    您可以将此站点用作正则表达式的测试区:https://regex101.com/r/uT8eS0/1

    首先,如果您想拥有多个匹配项,则必须定义匹配组。否则,您将始终只获得一场比赛。此外,您正在搜索单个字符,因为您正在搜索 h。如果要匹配多个,则必须将其更改为 h*h+。如果您决定使用+,它将匹配一个到无限个字符。如果您使用*,它将匹配零到无限个字符。

    将您的模式更改为"h+.*e+.*l+.*l+.*o+.* .*w+.*o+.*r+.*l+.*d+ 也会匹配它们之间的字符,因为它们在您发布的模式中的字符之间的.* 指令中处理。 Afaik 不可能只在一个字符串中匹配不同的组。您可以将组或子组中的每个字符分开,但这会导致大量不同的组。

    【讨论】:

      【解决方案3】:

      我知道,我应该用 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 更多 l 和 2 o……你明白了。

      现在,如果您想增强此功能并获得更多匹配项,请在字符串中向前移动一个字母并重新运行匹配项。

      你可以玩一会儿,效率高吗?不知道:)

      【讨论】:

      • Swift 和这个问题有什么关系?还是 Perl? OP 要求 C# 解决方案。
      • 是的,你说得对,我没看错。改成卢卡斯了。
      • 我仍在努力确定您在说哪种语言:C#、C++、Perl、Swift...
      • 它是 C#,它在我现在看到的 cmets 中。
      • 这种方法的时间复杂度是多少?
      【解决方案4】:

      查看this类似问题的解决方案(它在javascript中,但很容易理解)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-20
        • 2017-05-26
        • 2016-04-20
        • 1970-01-01
        • 2019-03-29
        • 2020-11-08
        • 2015-07-22
        相关资源
        最近更新 更多