2013-11-16 2 views
0

Я пытаюсь построить регулярное выражение, чтобы найти текст следующих вариантов.Регулярное выражение для соответствия определенным вариациям функции

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

Целью является извлечение TEXT. Я смог построить регулярное выражение для каждой отдельной функции или макроса, например, (?<=NSLocalizedString)\(@"(.*?)". Тем не менее, я ищу решение, которое выполняет работу независимо от имени функции, если она начинается с NSLocalizedString.

Я предполагаю, что все было так же просто, как (?<=NSLocalizedString\w+)\(@"(.*?)", но это похоже на трюк.

+1

Не беспокойтесь утверждений. Просто используйте ваше регулярное выражение таким образом - 'NSLocalizedString \ w + \ (@" (. *?) "' И прочитайте результат в группе захвата 1. – sln

ответ

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

Поскольку это регулярное выражение не использует утверждение lookbehind, оно выбирает всю функцию/макрос Цель состоит в том, чтобы извлечь только 'TEXT'. –

+1

TEXT зафиксирован в первой группе. –

+0

+1 - Я думаю, это нормально. – sln

1

Единственная причина, ваше регулярное выражение не работает потому, что движок регулярных выражений не поддерживает переменную длину просмотра назад. (?<=NSLocalizedString\w+) - переменная длина, поэтому нельзя использовать.

Во-первых, это должно быть \ w * not \ w +, чтобы ваша первая примерная строка соответствовала.

Если вы переместите \w* за пределы lookbehind (?<=NSLocalizedString)\w*, он будет работать нормально.

В качестве альтернативы, поскольку вы должны использовать группу захвата, чтобы в любом случае получить текстовое значение, вообще не нужно искать lookbehind. Изменение (?<= к (?:, и он становится не-захвата (которая может быть переменной длины), а затем просто захватить ваш текст значения из группы 1.

Ваша попытка была:

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

Оба эти незначительные изменения должны сделать его работу:

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

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

следующая фактически не поддерживается в Objective-C:

Решение, которое будет добывать точно TEXT без использования каких-либо групп является:

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

Это избавляет от необходимости использовать отрицательную (который назад 'не могут быть использованы по причинам, я объясню ниже), используя \K, который отрубает что-либо перед ним из матча.

+0

только что обновлен, чтобы включить то, что, я думаю, будет вашим идеальное решение (точно соответствует 'TEXT' без каких-либо групп), как вы изначально пытались сделать) – OGHaza

+0

Ваше решение действительно идеально, но модификатор' \ K' не поддерживается в Objective-C (http: // stackoverflow.ком/вопросы/13542950/поддержка-из-к-в-регулярное выражение). Выбранные вами альтернативы действительно работают. В самом начале было то, что утверждения lookbehind/lookahead не могут иметь переменную длину, как вы указали. –

+0

@BartJacobs, bah oh well :(отредактирует ответ. – OGHaza

Смежные вопросы