正则表达式以匹配函数的特定变体

时间:2013-11-16 17:32:27

标签: objective-c regex cocoa nsregularexpression

我正在尝试构建一个正则表达式来查找以下变体的文本。

NSLocalizedString(@"TEXT")
NSLocalizedStringFromTable(@"TEXT")
NSLocalizedStringWithDefaultValue(@"TEXT")
...

目标是提取TEXT。我已经能够为每个单独的函数或宏构建一个正则表达式,例如(?<=NSLocalizedString)\(@"(.*?)"。但是,我正在寻找能够完成工作的解决方案,无论函数的名称是什么,只要它以NSLocalizedString开头。

我认为它就像(?<=NSLocalizedString\w+)\(@"(.*?)"一样简单,但似乎没有做到这一点。

2 个答案:

答案 0 :(得分:4)

这个怎么样?

/NSLocalizedString\w*\(@"(.*)"\)/

说明:

  NSLocalizedString        'NSLocalizedString'
  \w+                      word characters (a-z, A-Z, 0-9, _) (0 or
                           more times (matching the most amount
                           possible))
  \(                       '('
  @"                       '@"'
  (                        group and capture to \1:
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
  )                        end of \1
  "                        '"'
  \)                       ')'

答案 1 :(得分:1)

正则表达式不起作用的唯一原因是因为正则表达式引擎不支持可变长度的lookbehinds。 (?<=NSLocalizedString\w+)是可变长度,因此无法使用。

首先,它必须是\ w *而不是\ w +,才能让你的第一个示例字符串匹配。

如果您将\w*移到lookbehind (?<=NSLocalizedString)\w*之外,它就会正常工作。

或者,由于您必须使用捕获组来获取文本值,因此根本不需要查看。将(?<=更改为(?:,它将变为非捕获组(可以是可变长度),然后只从组1中获取文本值。

您的尝试是:

(?<=NSLocalizedString\w+)\(@"(.*?)"

这两项小改动都应该有效:

(?<=NSLocalizedString)\w*\(@"(.*?)"

(?:NSLocalizedString\w*)\(@"(.*?)"

Objective-C实际上不支持以下内容:

在不使用任何组的情况下精确提取TEXT的解决方案是:

NSLocalizedString\w*\(@"\K[^"]*

通过使用\K修饰符,它可以避免使用负向lookbehind(由于我在下面解释的原因而无法使用),该修饰符会在匹配之前切掉任何内容。