使用正则表达式对ios中的字符串进行标记

时间:2014-05-12 13:25:55

标签: ios objective-c regex

简而言之:

给出以下字符串:

输入字符串 - > “你好,世界”,哦,我的,parapappa12

我想提取这三个“代币”:

输出令牌 - >

  • “你好,世界”
  • 哦,我的
  • parapappa12

在ios中对字符串进行标记

我有一个包含一些数据的文件。它看起来像:

word , word, word 
word , word, word 
word , word, word 

其中一些单词可以包含“”,但仅当单词以某个字符开头和结尾时才会出现,例如。以“结束”开头

单词示例:

word : blebla bla bla
word : "bla bla bla, bla"

如何定义一个正则表达式来根据单词之间的“,”加入白色空格来标记文件,并包括这个“特殊”的情况?

我记得在Perl中使用正则表达式来实现类似的东西,但很久以前我忘记了语法,我不确定Objective-C和iOS是否支持

2 个答案:

答案 0 :(得分:1)

首先,Perl oneliner(此处为fullscreen):

perl screenshot

# echo -n '"hello, world" , oh my, parapappa12' | perl -ne 'print "<$1>\n" while /("[^"]*"|[^, ]+)/g'
<"hello, world">
<oh>
<my>
<parapappa12>

这里the Objective C method

NSString* const str = @"\"hello, world\" , oh my, parapappa12";
[self splitCommas:str];

- (void)splitCommas:(NSString*)str
{
    NSString* const pattern = @"(\"[^\"]*\"|[^, ]+)";

    NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern
                                                                      options:0
                                                                        error:nil];
    NSRange searchRange = NSMakeRange(0, [str length]);
    NSArray *matches = [regex matchesInString:str
                                      options:0
                                        range:searchRange];

    for (NSTextCheckingResult *match in matches) {
        NSRange matchRange = [match range];
        NSLog(@"%@", [str substringWithRange:matchRange]);
    }
}

正则表达式的解释:

  1. 您要么搜索&#34;引用的字符串&#34;:"[^"]*"(除了引用之外的任何内容)
  2. 或者您在逗号之间捕获任何内容:[^, ]+(除了逗号或空格之外的任何内容)
  3. (方括号定义&#34;字符类&#34;插入符号否定它。)

    注意:我的解决方案无法处理"I say \"Hello\""

    中的转义引号

答案 1 :(得分:0)

在不知道你为什么需要解析这样的字符串的上下文的情况下,我无法给你一个很好的答案,但如果你发现自己需要解析一些更复杂的东西,我这里的一些想法可能比RegEx更好或者如果您想了解有关状态机和语法的更多信息。

  1. 您可以轻松编写basic state machine parser来使用NSScanner进行基本解析(该链接中的代码不是很好,所以请忽略它,但说明的概念)
  2. 您可以使用类似ParseKit的内容进行重度解析(这里可能有点过分)
  3. 您似乎满足于RegEx,但也许这将有助于未来的访问者。