0

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*)"在整个文本中查找下一个。任何想法如何解决这个问题?

4

1 回答 1

0

实际上,可以在引号之间到达内容,然后寻找)。

图案看起来像

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

它保证由 qsTr() 包装的内容是否从 " 开始,它将被定义地提取。例如,如果您要解析下一个字符串:

qsTr("source", count)

你会得到下一个结果:

"source", count

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

于 2013-09-09T11:01:28.920 回答