在的ObjectiveC
使用正则表达式捕获字符串之前和之后的一些数据我是比较新的正则表达式的表达式,需要一些建议。在的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)
先行(?=
)是错在这里,你有没有正确地躲过了\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
正则表达式是匹配给定模式的表达式。正则表达式可以匹配,比如像 “价值=!@#777” 字符串使用类似的表达式 “值= [#@!%^ &] [0-9]”,这说来匹配字面“ value =“,然后是由字符#,@,!,%,^和&组成的任何字符串,最后是由数字组成的任何字符串。但是,您不能单独使用单个正则表达式来获取所需字符串的部分,即“value = 777”。
所以,一个解决方案是创建一个字符串识别诸如“值=!@#777”的表情,然后执行该字符串一些进一步的处理,以删除有问题的字符。
我想你会使用NSScanner扫描数据和提取你想要的部分会更好。例如,您可以使用-scanString:intoString:
来获取“value =”部分,然后使用-scanCharactersFromSet:intoString:
删除不需要的部分,然后再次调用该方法以获取数字的集合。
嘿,你是对的。我只是想出了您的编辑根据您的第一个帮助和即将发表评论:) 一个件事寿,我将离开图案(值=)[^ \\ d *(\\ d +),因为“值=“始终有保证。非常感谢您的回答。将其标记为正确。 –