我有一些正则表达式问题(有时我们不是都这样)。 几段代码来自 Objective C,但我相信正则表达式仍然是相同的。
我有两个函数
NSString * CRLocalizedString(NSString *key)
NSString * CRLocalizedArgString(NSString *key, ...)
这些分散在我的本地化项目中。 现在我想把他们全部找到。 我们将进入目录,解析所有文件等 那里一切都很好。 我在文件上使用的正则表达式是
[NSRegularExpression regularExpressionWithPattern:@"CRLocalizedString\\(@\\\"[^)]+\\\"\\)" options:0 error:&error];
[NSRegularExpression regularExpressionWithPattern:@"CRLocalizedArgString\\([^)]+\\)" options:0 error:&error];
除了我的终止字符是 ) 之外,这很完美。
像这样的函数调用会出现问题
CRLocalizedString(@"Happy =), o so happy =D");
CRLocalizedArgString(@"Filter (%i)", 0.75f);
正则表达式在“Filter (%i”和“Happy =)”处结束字符串。 这就是我的正则表达式知识的终点,我现在不知道该做什么了。 我想用“);”作为结束,但情况并非总是如此。
所以我希望这里有人能帮我了解一些东西(当然也允许使用正则表达式来完成不同的事情)
亲切的问候
萨伦
最佳答案
让我们编写您的第一个正则表达式,而无需额外的 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\\(@\"([^\"\\\\]|\\\\.)*\"[^)]*\\)"
关于objective-c - 正则表达式(搜索函数(@"string content")以获取 "string content",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21758516/