2

我对正则表达式比较陌生,需要一些建议。

目标是将以下格式的数据获取到数组中:

  • 价值=777
  • 价值=888

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

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

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

所以我的问题是:

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

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

4

2 回答 2

3

前瞻 ( ?=) 在这里是错误的,您没有正确地转义\d(它变成\\d),最后但并非最不重要的是,您遗漏了量词*(0 次或多次) 和+(1 次或多次):

NSString *aTestString = @"value=!@#777!@#value=@#$**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 = @"foo=!@#777!@#bar=@#$**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
于 2012-01-21T22:59:31.610 回答
0

正则表达式是匹配给定模式的表达式。一个正则表达式可以匹配一个字符串,比如“value=!@#777”,使用一个像“value=[#@!%^&] [0-9] ”这样的表达式,它表示匹配文字“value= ",然后是由字符#、@、!、%、^ 和 & 组成的任何字符串,最后是由数字组成的任何字符串。但是您不能单独使用单个正则表达式来获取您想要的字符串部分,即“value=777”。

因此,一种解决方案是创建一个表达式来识别诸如“value=!@#777”之类的字符串,然后对该字符串进行进一步处理以删除有问题的字符。

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

于 2012-01-21T22:59:40.800 回答