【问题标题】:Match multiple occurrences in the string Regex匹配字符串 Regex 中的多次出现
【发布时间】:2017-11-25 04:37:20
【问题描述】:

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

例如 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");

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

“a”只有一个匹配项。

【问题讨论】:

  • 显示使用 Regex 变量的其余代码。
  • 您没有向我们提供足够的信息来帮助您。请编辑您的帖子,为我们提供更多代码,以便能够帮助您解决这个问题:) 您可能需要查看stackoverflow.com/help/how-to-ask
  • 更新了我的代码
  • 请解释为什么w:/a\bc::/12\xyz 中出现了八次。请列出它们。
  • 第一个 w:/a\b 第二个 w:/a\bc 第三个 bc::/12\x 第四个 bc::/12\xy 第五个 bc::/12\xyz 第六个 c:: /12\x 第七 c::/12\xy 八 c::/12\xyz 所以八次出现..

标签: c# .net regex


【解决方案1】:

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

这是一种方法:

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 字母,请将模式中的 [a-zA-Z] 替换为 [a-zA-Z]@"^[a-zA-Z]+[a-zA-Z\d:]*/[a-zA-Z\d]+\\[a-zA-Z\d]+$"

【讨论】:

    【解决方案2】:
        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;
        }
    }
    

    【讨论】:

    猜你喜欢
    • 2011-10-25
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    相关资源
    最近更新 更多