用于解析Qt本地化函数参数的Java正则表达式

用于解析Qt本地化函数参数的Java正则表达式,java,regex,qt,greedy,localizable.strings,Java,Regex,Qt,Greedy,Localizable.strings,Qt具有用于本地化调用的特殊功能。 函数,如qsTr(),tr(),QT\u tr\u NOOP(),qstranlate(),等等 我需要解析上述函数调用params的内容 例如,qsTr(): 该函数只有3个可能的调用 qsTr("source") qsTr("source", "disambiguation") qsTr("source", "disambiguation", count) // count - some int value for source

Qt具有用于本地化调用的特殊功能。 函数,如
qsTr()
tr()
QT\u tr\u NOOP()
qstranlate()
,等等

我需要解析上述函数调用params的内容

例如,
qsTr()

该函数只有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*\\))
由于贪婪的量词,上述正则表达式将失败。它将在全文中查找下一个
“\\s*)”

有没有办法解决这个问题?

事实上,可以在引号之间找到内容,然后再寻找答案)

图案看起来像

Pattern.compile("\\qsTr?\\s*\\(\\s*(((\".*?(?<!\\\\)\")|('.*?(?<!\\\\)')).*?)(?=\\))", Pattern.DOTALL);
您将获得下一个结果:

"source", count
然后,您可以检查提取的字符串的有效性(例如,如果qsTr函数可能在静态字符串param之后包含另一个参数)

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