2012-01-21 197 views
2

使用正则表达式捕获字符串之前和之后的一些数据我是比较新的正则表达式的表达式,需要一些建议。在的ObjectiveC

的目标是在下面的格式中获取数据到一个数组:

  • 值= 777
  • 值= 888

从这个数据:“值= @# !777 @#值= @#$ 888 *

这里是我的代码(目标C):

NSString *aTestString = @"[email protected]#[email protected]#[email protected]#$**888***"; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"value=(?=[^\d])(\d)" options:0 error:&anError]; 

所以我的问题是:

1)可以在拆分一样,正则表达式引擎捕获数据?检索“value =”删除中间的垃圾数据,然后将其编号为“777”等?

2)如果可以做到这一点,那就是我的正则表达式表达有效?值=(?= [^ \ d])(\ d)

回答

3

先行(?=)是错在这里,你有没有正确地躲过了\d(变成\\d)和最后但并非最不重要,你离开了量词*(0次或更多次),并+(1次以上):

NSString *aTestString = @"[email protected]#[email protected]#[email protected]#$**888***"; 
NSRegularExpression *regex = [NSRegularExpression 
    regularExpressionWithPattern:@"value=[^\\d]*(\\d+)" 
    options:0 
    error:NULL 
]; 

[regex 
    enumerateMatchesInString:aTestString 
    options:0 
    range:NSMakeRange(0, [aTestString length]) 
    usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { 
     NSLog(@"Value: %@", [aTestString substringWithRange:[result rangeAtIndex:1]]); 
    } 
]; 

编辑:这里的一个更精细的图案。它在=之前捕获一个单词,然后丢弃非数字并在之后捕获数字。

NSString *aTestString = @"[email protected]#[email protected]#[email protected]#$**888***"; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(\\w+)=[^\\d]*(\\d+)" options:0 error:NULL]; 

[regex 
    enumerateMatchesInString:aTestString 
    options:0 
    range:NSMakeRange(0, [aTestString length]) 
    usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { 
     NSLog(
      @"Found: %@=%@", 
      [aTestString substringWithRange:[result rangeAtIndex:1]], 
      [aTestString substringWithRange:[result rangeAtIndex:2]] 
     ); 
    } 
]; 

// Output: 
// Found: foo=777 
// Found: bar=888 
+0

嘿,你是对的。我只是想出了您的编辑根据您的第一个帮助和即将发表评论:) 一个件事寿,我将离开图案(值=)[^ \\ d *(\\ d +),因为“值=“始终有保证。非常感谢您的回答。将其标记为正确。 –

0

正则表达式是匹配给定模式的表达式。正则表达式可以匹配,比如像 “价值=!@#777” 字符串使用类似的表达式 “值= [#@!%^ &] [0-9]”,这说来匹配字面“ value =“,然后是由字符#,@,!,%,^和&组成的任何字符串,最后是由数字组成的任何字符串。但是,您不能单独使用单个正则表达式来获取所需字符串的部分,即“value = 777”。

所以,一个解决方案是创建一个字符串识别诸如“值=!@#777”的表情,然后执行该字符串一些进一步的处理,以删除有问题的字符。

我想你会使用NSScanner扫描数据和提取你想要的部分会更好。例如,您可以使用-scanString:intoString:来获取“value =”部分,然后使用-scanCharactersFromSet:intoString:删除不需要的部分,然后再次调用该方法以获取数字的集合。

+0

只是一个简短的说明,我的经验是RegEx比NSScanner快得多,对于任何复杂的事情。 –

+1

当然,你可以得到匹配字符串的一部分,这是什么组被用于。但是在这种情况下,你不会得到最终的'value = 777'作为输出,但是一次匹配会给你一个'value'(或者'value =')的组合,另一个匹配你需要的'777'结合。 – DarkDust

+0

@DarkDust我的意思是说一个正则表达式不能在一个单一的步骤中获得所有的部分。您必须匹配所需的部分,然后重新组合它们,或匹配较长的部分并删除不需要的部分,可能使用其他表达式。 – Caleb