正则表达式(搜索函数(@“字符串内容”)以获取“字符串内容”

时间:2014-02-13 15:30:04

标签: objective-c regex

我有一点正则表达式问题(有时我们都不是)。 几段代码来自Objective C,但我认为正则表达式仍然是相同的。

我有两个叫做

的函数
NSString * CRLocalizedString(NSString *key)
NSString * CRLocalizedArgString(NSString *key, ...)

这些分散在我的项目中以进行本地化。 现在我想找到它们。 那么去目录,解析所有文件等 一切都很好。 我在文件上使用的正则表达式是

[NSRegularExpression regularExpressionWithPattern:@"CRLocalizedString\\(@\\\"[^)]+\\\"\\)" options:0 error:&error];
[NSRegularExpression regularExpressionWithPattern:@"CRLocalizedArgString\\([^)]+\\)" options:0 error:&error];

除了我的终止字符是a)之外,这种方法很完美。

像这样的函数调用会出现问题

CRLocalizedString(@"Happy =), o so happy =D");
CRLocalizedArgString(@"Filter (%i)", 0.75f);

正则表达式在“Filter(%i”和“Happy =)”处结束字符串。 这就是我的正则表达式知识结束的地方,我现在不再做什么了。 我想用“);”作为目的,但并非总是如此。

所以我希望有人能在这里找到一些东西(完全不同的东西,当然也允许正则表达式)

亲切的问候

萨恩

1 个答案:

答案 0 :(得分:3)

让我们编写你的第一个正则表达式而不需要额外的C级转义:

CRLocalizedString\(@\"[^)]+\"\)

你不必为正则表达式转义",所以让我们摆脱那些额外的反斜杠:

CRLocalizedString\(@"[^)]+"\)

因此,您希望使用"[^)]+"匹配带引号的字符串。但这与每个引用的字符串都不匹配。

什么是引用字符串?它是",后跟任意数量的字符串原子,后跟另一个"。什么是弦原子?它是除"\ a \后跟任何字符的任何字符。所以这是引用字符串的正则表达式:

"([^"\\]|\\.)*"

坚持回到你的第一个正则表达式,我们得到了这个:

CRLocalizedString\(@"([^"\\]|\\.)*"\)

Here's a link to a regex tester demonstrating that regex. 在Objective-C字符串文字中引用它给我们:

@"CRLocalizedString\\(@\"([^\"\\\\]|\\\\.)*\"\\)"

在一般情况下,编写正则表达式以匹配对CRLocalizedArgString的调用是不可能的,因为此类调用可以将任意表达式作为参数,并且正则表达式不能匹配任意表达式(因为它们可以包含任意级别的嵌套括号,正则表达式无法匹配)。

您可能只希望参数列表中没有括号,并使用此正则表达式:

CRLocalizedArgString\(@"([^"\\]|\\.)*"[^)]*\)

Here's a link to a regex tester demonstrating that regex. 在Objective-C字符串文字中引用它给我们:

@"CRLocalizedArgString\\(@\"([^\"\\\\]|\\\\.)*\"[^)]*\\)"