多个正则表达式匹配重复多行的块

时间:2013-02-04 02:39:38

标签: objective-c regex

更新0

我在下方for (... match in)添加了代码。

更新0

我的源文本大约每40行重复一次。下面我将在下面的两个重复中显示8行。 The full data set is here。我需要从“[Board]”行引用引号之间的一位或两位数字;从“[经销商]”行我需要引号之间的单个字母。

[Board "1"]
[Dealer "N"]
[Vulnerable "None"]
[Deal "N:Q952.652.KJT4.95 T.KQT84.A865.J73 K8763.A7.Q.KQT84 AJ4.J93.9732.A62"]
[Scoring ""]
[Declarer ""]
[Contract ""]

[Board "2"]
[Dealer "E"]
[Vulnerable "NS"]
[Deal "E:K8542.3.4.AT7532 J76.K7.AT85.KQJ8 QT3.AJ84.KJ963.4 A9.QT9652.Q72.96"]
[Scoring ""]
[Declarer ""]
[Contract ""]

以下正则表达式有效,但只能选择一个匹配,而不是我文本中的30多个匹配。

NSString *toMatch = @"\\[Board \"([0-9][0-9]?)\"\\].*\\[Dealer \"([NEWS])\"\\]";
NSRegularExpression *regex = [NSRegularExpression  regularExpressionWithPattern:toMatch options:NSRegularExpressionDotMatchesLineSeparators error:&error];
for (NSTextCheckingResult* match in [regex matchesInString:string options:NSRegularExpressionDotMatchesLineSeparators range:NSMakeRange(0, [string length])])
    {
        NSLog(@"Number of ranges in match: %u", match.numberOfRanges);
        for (NSUInteger i = 0; i < match.numberOfRanges; ++i)
        {
            NSRange matchedRange = [match rangeAtIndex: i];
            NSString* tstring = [string substringWithRange: matchedRange];
            NSLog(@"range %lu string: %@", (unsigned long)i, tstring);
        }
    }

我怀疑问题出在换行符中,但我不知道如何修复它和选项 。这是此question的延续。

如何修复正则表达式模式以获得多个匹配项?

(另外,我在“[Deal]”行上需要以下内容,但是现在让我们忽略它。我需要四个独立的组,第一个在“:”之后,在空格之前,第二个和第三个是在空格之间,最后一个是在最后一个空格之后和引用之前的所有内容。)

2 个答案:

答案 0 :(得分:3)

我可能错了,但我认为您的模式中的问题是您选择了.* NSRegularExpressionDotMatchesLineSeparators,以便.*匹配所有内容,直到它到达源文本中最后一次出现的[Dealer

您可以使用.*.*?转换为“非贪婪”版本,或者您可以避免使用.*并将其替换为\\n(假设您的输入使用单个\n分隔。请注意,为了使正则表达式编译器能够看到\n(这是与链接字符匹配的已识别转义序列),您必须转义NSString中的\,所以你必须使用\\n,即:

NSString *toMatch = "\\[Board \"([0-9][0-9]?)\"\\]\\n\\[Dealer \"([NEWS])\"\\]";

如果源文本包含Windows行结尾,则可以使用\\r\\n代替

答案 1 :(得分:0)

试试这个(未转义)模式:

\[(\w+)\s+\"([^\"]*)\"\]

第一组是标签名称,第二组匹配组是引号之间的内容,无论它是什么。您可能能够在代码中分别使用\1\2来捕获这些值。