您的正则表达式助手。使在 Objective-C 中使用正则表达式变得短暂、甜蜜且高效。
您可以使用 Regexer 非常快速地执行简单的匹配检查
BOOL match = [@"Hello World!" rx_matchesPattern:@"[a-zA-Z ]+?!"];
如果您想提取字符串而不是进行布尔匹配检查,您也可以这样做。当使用 Regexer 查找匹配项时,您将获得零个或多个 RXMatch
实例。每个 RXMatch
代表给定模式的单个出现。一个 RXMatch
暴露了其文本、范围和一个 RXCapture
数组(也可以通过索引索引访问,即方括号语法)。数组中的第一个捕获是整个匹配模式($0)和后面的捕获对应于模式的捕获组($1、$2、...)。每个捕获暴露了捕获的文本及其在原始字符串中的范围。
如果您只想知道给定的字符串是否与模式匹配,可以这样做:
BOOL match = [@"Hello World!" rx_matchesPattern:@"[a-zA-Z ]+?!"];
BOOL match = [@"Hello World!" rx_matchesPattern:@"[a-z ]+?!" options:NSRegularExpressionCaseInsensitive];
您可以快速获取您模式匹配的文本和范围
NSString *someText = @"What is your quest?";
NSString *pattern = @"\\b[a-zA-Z]+?\\b";
NSArray *texts = [someText rx_textsForMatchesWithPattern:pattern];
NSArray *ranges = [someText rx_rangesForMatchesWithPattern:pattern];
如果您对文本和范围都感兴趣,您可以利用 Regexer 在 RXMatch
级别也暴露匹配文本和范围的事实。这与在匹配中访问第一个捕获($0)相当,它始终对应于整个匹配模式。如果您不使用捕获组,这是一种处理匹配项的绝佳方式
NSArray *matches = [someText rx_matchesWithPattern:pattern];
for (RXMatch *match in matches)
{
NSLog(@"Text: %@, Range: [location: %d, length: %d]", [match text],
[match range].location,
[match range].length);
}
以下模式匹配单词,并使用捕获组捕获每个单词的第一个字母,此外还会捕获整个匹配的字符串($0)。通过使用索引索引(方括号运算符),您可以快速提取所需的信息
NSArray *matches = [@"To seek the Holy Grail." rx_matchesWithPattern:@"\\b([a-zA-Z])([a-zA-Z]+?)\\b"];
NSString *word1 = [matches[0][0] text]; // @"To" (equivalent to $0 in regex-speak)
NSString *letter1 = [matches[0][1] text]; // @"T" (equivalent to $1 in regex-speak)
NSString *remainder1 = [matches[0][2] text]; // @"o" (equivalent to $2 in regex-speak)
NSRange word1Range = [matches[0][0] range]; // 0..1 (NSRange)
您还可以根据需要迭代匹配项和/或捕获
for (RXCapture *capture in [matches[1] captures])
{
NSLog(@"Text: %@, Range: [location: %d, length: %d]", [capture text],
[capture range].location,
[capture range].length);
}
如果您对模式所有匹配项的特定捕获组感兴趣,您可以获取该组的
NSArray *captures = [@"To seek the Holy Grail." rx_capturesForGroup:1 withPattern:@"\\b([a-zA-Z])([a-zA-Z]+?)\\b"];
NSString *firstLetter1 [captures[0] text] // @"T"
NSString *firstLetter2 [captures[1] text] // @"s"
NSString *firstLetter3 [captures[2] text] // @"t"
NSString *firstLetter4 [captures[3] text] // @"H"
NSString *firstLetter5 [captures[4] text] // @"G"
... 或者如果您只感兴趣于这些捕获的文本,您可以直接请求它
NSArray *texts = [@"To seek the Holy Grail." rx_textsForGroup:1 withPattern:@"\\b([a-zA-Z])([a-zA-Z]+?)\\b"];
// texts == @[@"T", @"s", @"t", @"H", @"G"]
... 同样适用于范围
NSArray *ranges = [@"To seek the Holy Grail." rx_rangesForGroup:1 withPattern:@"\\b([a-zA-Z])([a-zA-Z]+?)\\b"];
// ranges == 0..1, 3..6, ... (NSRange's boxed in NSValue instances)
如果您更喜欢更加显式并避免索引索引,您也可以直接操作
NSArray *matches = [@"To seek the Holy Grail." rx_matchesWithPattern:@"\\b([a-zA-Z])([a-zA-Z]+?)\\b"];
RXMatch *match = [matches firstObject];
RXCapture *capture = [[match captures] objectAtIndex:0]; // Or: match[0]
NSString *text = [capture text];
NSRange range = [capture range];
如果您只需一个预编译、缓存的NSRegularExpression实例来执行Regexer API未涵盖的一些更高级的 regex 操作,您可以获取一个如下所示
NSRegularExpression *regex = [@"[a-zA-Z0-9]{10}" rx_regex];
NSRegularExpression *regexWithOptions = [@"[a-zA-Z0-9]{10}" rx_regexWithOptions:NSRegularExpressionCaseInsensitive];
使用Regexer执行基于regex的替换操作很简单
NSString *altered = [@"What is your quest?" rx_stringByReplacingMatchesOfPattern:@"\\b([a-zA-Z]+?)\\b" withTemplate:@"$1-hello"];
// Result: @"What-hello is-hello your-hello quest-hello?"
Michaël Fortin ([邮箱地址可见])
Regexer在MIT许可下提供。有关更多信息,请参阅LICENSE文件。