【问题标题】:Regular expression to match specific variations of function正则表达式匹配函数的特定变体
【发布时间】:2013-11-30 01:13:06
【问题描述】:

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

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

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

我以为它就像 (?<=NSLocalizedString\w+)\(@"(.*?)" 一样简单,但这似乎不起作用。

【问题讨论】:

  • 不要为断言而烦恼。只需以这种方式使用您的正则表达式 - NSLocalizedString\w+\(@"(.*?)" 并在捕获组 1 中读取结果。

标签: objective-c regex cocoa nsregularexpression


【解决方案1】:

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

首先它需要是 \w* 而不是 \w+,以允许您的第一个示例字符串匹配。

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

另外,由于无论如何您都必须使用捕获组来获取文本值,因此根本不需要后视。将(?<= 更改为(?:,它将成为一个非捕获组(可以是可变长度),然后从组1 中获取您的文本值。

您的尝试是:

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

这两个小改动应该可以让它工作:

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

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

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

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

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

通过使用\K 修饰符,它避免了使用否定的lookbehind(由于我在下面解释的原因而不能使用)的需要,该修饰符将匹配之前的任何内容都从比赛中剔除。

【讨论】:

  • 刚刚更新以包含我认为将是您理想的解决方案(完全匹配 TEXT 而不使用任何组 - 正如您最初尝试做的那样)
  • 您的解决方案确实很理想,但在 Objective-C (stackoverflow.com/questions/13542950/support-of-k-in-regex) 中不支持 \K 修饰符。您建议的替代方案确实有效。正如您所指出的那样,问题确实是lookbehind/lookahead断言不能具有可变长度。
【解决方案2】:

这个怎么样?

/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
  "                        '"'
  \)                       ')'

【讨论】:

  • 由于这个正则表达式不使用后向断言,它选择整个函数/宏。目标是只提取TEXT
  • TEXT 在第一组中被捕获。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2017-07-02
  • 1970-01-01
相关资源
最近更新 更多