Regexer 1.3.3

Regexer 1.3.3

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新版本2016年3月

Michaël Fortin 维护。



Regexer 1.3.3

您的正则表达式助手。使在 Objective-C 中使用正则表达式变得短暂、甜蜜且高效。

功能

  • 作为 NSString 的类别实现,使正则表达式使用代码极为简洁。
  • Regexer 缓存编译的正则表达式,以防止对相同模式和选项的后续使用进行不必要的重新编译。在没有将实例化和缓存逻辑污染到您的类中时使用正则表达式。
  • 使用索引索引来提供对匹配项和捕获组的简洁访问(可选)。
  • 按需懒编译正则表达式。
  • Regexer 是线程安全的。

基本

您可以使用 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实例

如果您只需一个预编译、缓存的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?"

实现细节

  • Regexer通过模式和选项索引缓存的编译regex,所以您可以放心地,具有相同模式但具有不同选项的多个regex不会冲突。

安装

作者

Michaël Fortin ([邮箱地址可见])

许可

Regexer在MIT许可下提供。有关更多信息,请参阅LICENSE文件。