VerbalExpressions-for-Objective-C 0.0.1

VerbalExpressions-for-Objective-C 0.0.1

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2014年12月

Peter Hosey 维护。



  • Peter Hosey

Objective-C 的 Verbal Expressions

正则表达式语法和 Objective-C 详尽性的结合

这是 @jehna 的 VerbalExpressions 项目的 Objective-C 实现。这是一个原始实现;我仅复制了方法名称,没有更多。

用法

创建一个 PRHVerbalExpression,然后将消息发送给它以设置选项和构建搜索模式。每个选项或模式消息返回 self,因此您可以堆叠一系列这样的消息来描述模式。

每个 PRHVerbalExpression 都响应一系列匹配方法,您可以将其用于将模式应用于字符串。

例如

NSString *prefix = @"Hello";
NSString *suffix = @"Your attention please!";
NSString *entireString = [NSString stringWithFormat:@"%@, people of Earth!\n%@", prefix, suffix];
PRHVerbalExpression *expression = [[[[[[[
    [PRHVerbalExpression new]
    searchMultipleLines]
    startOfLine]
    then:prefix]
    anything]
    then:suffix]
    endOfLine];
bool match = [expression matchesString:entireString];

在头文件和此文档中,“字面字符串”是不检查正则表达式元字符(或者如果有,是为了转义它们)的字符串。因此,例如,字面字符串 @"[^0-9]" 将匹配恰好六个字符(或者根本不匹配):一个开方括号,一个插入符号,一个零,一个连字符减号,一个九,和一个闭方括号。它不会匹配范围之外的任何单个字符。

区别

字符类

对于字符类,原始 JavaScript 实现将包含两个参数的方法命名为 range

本版本用四个不同的方法替换了这一方法

  • characterClassWithRangeFrom:(unichar)from to:(unichar)to
  • extendCharacterClassWithRangeFrom:(unichar)from to:(unichar)to
  • characterClassWithCharacter:(unichar)ch
  • extendCharacterClassWithCharacter:(unichar)ch

例如,一个简单的格式化数字的表达式可能看起来像这样

[[[
    [PRHVerbalExpression new]
    characterClassWithRangeFrom:'0' to:'9']
    extendCharacterClassWithCharacter:',']
    extendCharacterClassWithCharacter:'.'];

(这将生成正则表达式 [0-9,.].)

我添加了创建组的方法

  • group:(id)literalStringOrVerbalExpression
  • nonCapturingGroup:(id)literalStringOrVerbalExpression

每个方法都接受字面字符串或 PRHVerbalExpression。

倍数

我添加了指定子表达式连续出现的最小和最大次数的方法

  • maybe:(id)literalStringOrVerbalExpression (?)
  • zeroOrMoreOf:(id)literalStringOrVerbalExpression (*)
  • oneOrMoreOf:(id)literalStringOrVerbalExpression (+)
  • atLeast:(NSUInteger)min butNoMoreThan:(NSUInteger)max ofExpression:(id)literalStringOrVerbalExpression ({min,max})

改进空间

其中一些功能尚未实现,大多数功能也尚未经过测试。PRHVerbalExpression中任何简单地返回self的方法都尚未实现。

此外,某些方法名称可以做更多记录性描述,以符合典型的Objective-C命名规范。

我最初的项目愿景是实现一些运行时hackery,以便无需嵌套方法调用。我仍然想尝试这一点,虽然我不确定如何处理无参数方法(如startOfLine/endOfLine)。

某些事情可以更稳健。例如,如果你在endOfLine之后添加了任何内容(除了另一个子表达式),你可能会遇到麻烦。理想情况下,大多数方法应该替换并重新追加$(如果存在的话)。

欢迎贡献。