Регулярное выражение Java для разбора параметров функций локализации Qt

Qt имеет специальные функции для вызова локализации. Такие функции, как qsTr(), tr(), QT_TR_NOOP(), qsTranslate() и т. д.

Мне нужно проанализировать содержимое вышеуказанных параметров вызовов функций.

Например, qsTr():

qsTr(string source, string disambiguation, int n)

Есть только 3 возможных вызова этой функции

qsTr("source")
qsTr("source", "disambiguation")
qsTr("source", "disambiguation", count) // count - some int value for source 
                                        // if it contains plurals - %n

Предположим, мы нашли в исходниках Qt или QML эту строку:

qsTr("source string")

Для такого случая я написал регулярное выражение Java:

(?<=qsTr\\()(\\s*(\\".*?(?<\\\\)\\")?)(?=\\s*\\))

Вышеупомянутое регулярное выражение будет точно соответствовать «исходной строке», и это правильно.

Но мне нужно регулярное выражение DOTALL, а не только для одной строки.

Одна из возможных проблем заключается в том, что мы можем найти следующий вызов, который неверен, и мы должны его игнорировать:

qsTr("source", count)

Приведенное выше регулярное выражение не удастся из-за жадных квантификаторов. Он будет искать следующий "\\s*)" по всему тексту. Есть идеи, как это исправить?


person Alex Gorbunov    schedule 09.08.2013    source источник


Ответы (1)


На самом деле можно найти содержимое между кавычками, а затем искать ).

Узор будет выглядеть

Pattern.compile("\\qsTr?\\s*\\(\\s*(((\".*?(?<!\\\\)\")|('.*?(?<!\\\\)')).*?)(?=\\))", Pattern.DOTALL);

Это гарантирует, что если содержимое, обернутое qsTr(), начинается с ", оно будет определенно извлечено. Например, если вы анализируете следующую строку:

qsTr("source", count)

вы получите следующий результат:

"source", count

И затем вы можете проверить правильность извлеченной строки (например, возможно ли, чтобы функция qsTr содержала другие параметры после параметра статической строки).

person Alex Gorbunov    schedule 09.09.2013