匹配字符串Regex中的多个匹配项

时间:2017-11-25 04:37:21

标签: c# .net regex

我需要匹配正则表达式以匹配同一字符串中的多个匹配项。 模式是字母然后零或更多数字,字母,冒号然后正斜杠然后一个或多个数字,字母然后反斜杠然后再一个或多个数字,字母

例如,

w:/a\bc::/12\xyz应该给我出现8。

我尝试了以下代码

Regex a11 = new Regex(@"([a-z]+[a-z1-9:]+/[a-z1-9]+\\[a-z1-9]+)+");
Regex a1 = new Regex(@"([a-z]+/[a-z1-9]+\\[a-z1-9]+)+");
var a = a11.Matches(@"w:/a\bc::/12\\xyz");

但即使多次出现也只匹配一次。同样在模式中,第二个字符是可选的,所以我声明了两个正则表达式。有没有办法在一个正则表达式中做所有事情。非常感谢任何帮助

“a”只有一场比赛。

2 个答案:

答案 0 :(得分:0)

您需要从输入字符串生成所有从一个相同位置开始的子串,然后使用^$个锚点附带的模式来测试整个字符串匹配。

这是一种方法:

var s = "w:/a\\bc::/12\\xyz";
var r = new Regex(@"^\p{L}+[\p{L}\d:]*/[\p{L}\d]+\\[\p{L}\d]+$", RegexOptions.Compiled);
for (var q = 0; q < s.Length; ++q)
    for (var w = q; w <= s.Length; ++w)
    {
        var cur = s.Substring(q, w-q);
        if (r.IsMatch(cur))
            Console.WriteLine("FOUND: {0}", cur);
    }

输出:

FOUND: w:/a\b
FOUND: w:/a\bc
FOUND: bc::/12\x
FOUND: bc::/12\xy
FOUND: bc::/12\xyz
FOUND: c::/12\x
FOUND: c::/12\xy
FOUND: c::/12\xyz

请参阅C# demo

模式是

^\p{L}+[\p{L}\d:]*/[\p{L}\d]+\\[\p{L}\d]+$

<强>详情

  • ^ - 字符串开头
  • \p{L}+ - 1+个字母
  • [\p{L}\d:]* - 0+个字母,数字或/和:
  • / - /字符
  • [\p{L}\d]+ - 1+个字母或/和数字
  • \\ - \字符
  • [\p{L}\d]+ - 1+个字母或/和数字
  • $ - 字符串结束。

请参阅regex demo at regex101.com

注意:要仅匹配ASCII字母,请将\p{L}替换为模式[a-zA-Z]中的@"^[a-zA-Z]+[a-zA-Z\d:]*/[a-zA-Z\d]+\\[a-zA-Z\d]+$"

答案 1 :(得分:0)

    public static void Main(string[] args)
    {
        List<string> commands = new List<string>()
        {
            @"w\\//a/b",
            @"w\\//a\b",
            @"w\\/a\b",
            @"w:://a\b",
            @"w::/a\b",
            @"w:/a\bc::/12\xyz"
        };

        var titlist = commandCount(commands);
        foreach (var value in titlist)
        {
            Console.WriteLine(value);
        }

        Console.Read();
    }

    public static List<int> commandCount(List<string> commands)
    {
        List<int> lengths = new List<int>();
        foreach (var command in commands)
        {
            var count = 0;
            var substring = GetAllSubstring(command);
            for (int i = 0; i < substring.Count; i++)
            {
                string input = substring[i];
                Regex r1 = new Regex(@"^[a-z]{1}\w*\:*\/\w+\\[a-z]+$");
                Match match = r1.Match(input);
                if (match.Success)
                    count += match.Groups.Count;
            }
            lengths.Add(count);
        }

        return lengths;
    }

    static List<string> GetAllSubstring(string command)
    {
        List<string> substrings = new List<string>();
        char[] array = command.ToCharArray();
        for (int i = 0; i < array.Length; i++)
        {
            StringBuilder sub = new StringBuilder(array[i].ToString());
            substrings.Add(sub.ToString());
            for (int j = i+1; j < array.Length; j++)
            {
                substrings.Add(sub.Append(array[j]).ToString());
            }
        }

        return substrings;
    }
}