如何使用正则表达式解析重复模式

时间:2010-09-27 09:43:54

标签: java regex

我想使用正则表达式在字符串中查找未知数量的参数。我认为,如果我解释它会很难,所以让我们看一下这个例子:

正则表达式:@ISNULL\('(.*?)','(.*?)','(.*?)'\)
字符串:@ISNULL('1','2','3')
结果:

Group[0] "@ISNULL('1','2','3')" at 0 - 20 
Group[1] "1" at 9 - 10 
Group[2] "2" at 13 - 14  
Group[3] "3" at 17 - 18  

这很有效。 当我需要找到未知数量的参数(2和更多)时,问题就开始了。

我需要对正则表达式做些什么更改才能找到字符串中会出现的所有参数?

所以,如果我解析这个字符串"@ISNULL('1','2','3','4','5','6')",我会找到所有的参数。

2 个答案:

答案 0 :(得分:2)

如果您不知道重复构造中潜在匹配的数量,除了捕获组之外,还需要regex engine that supports capturesOnly .NET and Perl 6 offer this currently.

在C#中:

  string pattern = @"@ISNULL\(('([^']*)',?)+\)";
  string input = @"@ISNULL('1','2','3','4','5','6')";
  Match match = Regex.Match(input, pattern);
  if (match.Success) {
     Console.WriteLine("Matched text: {0}", match.Value);
     for (int ctr = 1; ctr < match.Groups.Count; ctr++) {
        Console.WriteLine("   Group {0}:  {1}", ctr, match.Groups[ctr].Value);
        int captureCtr = 0;
        foreach (Capture capture in match.Groups[ctr].Captures) {
           Console.WriteLine("      Capture {0}: {1}", 
                             captureCtr, capture.Value);
           captureCtr++; 
        }
     }
  }   

在其他正则表达式中,您必须分两步完成。例如,在Java中(代码片段由RegexBuddy提供):

首先,找到所需字符串的一部分:

Pattern regex = Pattern.compile("@ISNULL\\(('([^']*)',?)+\\)");
// or, using non-capturing groups: 
// Pattern regex = Pattern.compile("@ISNULL\\((?:'(?:[^']*)',?)+\\)");
Matcher regexMatcher = regex.matcher(subjectString);
if (regexMatcher.find()) {
    ResultString = regexMatcher.group();
} 

然后使用另一个正则表达式查找并迭代您的匹配项:

List<String> matchList = new ArrayList<String>();
try {
    Pattern regex = Pattern.compile("'([^']*)'");
    Matcher regexMatcher = regex.matcher(ResultString);
    while (regexMatcher.find()) {
        matchList.add(regexMatcher.group(1));
    } 

答案 1 :(得分:0)

这个答案有些推测,因为我不知道你正在使用什么正则表达式引擎。 如果参数始终是数字并且始终用单引号括起来,那么为什么不尝试使用这样的数字类:

'(\d)+?'

这只是\d类,删除了无关的@ISNULL内容,因为我假设您只对参数本身感兴趣。您可能不需要+,当然我不知道您使用的引擎是否支持惰性?运算符,只需试一试。