0

更新 0

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

更新 0

我的源文本大约每 40 行重复一次。下面我为下面的 2 次重复显示 8 行。完整的数据集在这里。我需要“[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);
        }
    }

我怀疑问题出在换行符中,但我不知道如何解决它和 options 。这是这个问题的延续。

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

(此外,我需要在“[Deal]”行中添加以下内容,但我们暂时忽略它。我需要四个单独的组,第一个在“:”之后和空格之前,第二个和第三个在空格之间,最后一个是最后一个空格之后和引号之前的所有内容。)

4

2 回答 2

3

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

您可以使用 将.*转换为“非贪婪”版本.*?,或者您可以完全避免使用.*并替换它\\n(假设您的输入用单个 分隔\n)。请注意,为了让正则表达式编译器看到\and n(这是与换行符匹配的公认转义序列),您必须\在 NSString 中转义,因此您必须使用\\n,即:

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

如果您的源文本有 Windows 行尾,您可以\\r\\n改用,等等。

于 2013-02-04T03:48:46.607 回答
0

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

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

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

于 2013-02-04T02:50:41.183 回答