更新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]”行上需要以下内容,但是现在让我们忽略它。我需要四个独立的组,第一个在“:”之后,在空格之前,第二个和第三个是在空格之间,最后一个是在最后一个空格之后和引用之前的所有内容。)
答案 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
来捕获这些值。