首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析Qt本地化函数params的Java正则表达式

解析Qt本地化函数params的Java正则表达式
EN

Stack Overflow用户
提问于 2013-08-09 10:54:39
回答 1查看 165关注 0票数 0

Qt具有特殊的本地化调用功能。如qsTr()tr()QT_TR_NOOP()qsTranslate()等。

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

例如,qsTr()

代码语言:javascript
复制
qsTr(string source, string disambiguation, int n)

只有3种可能的函数调用。

代码语言:javascript
复制
qsTr("source")
qsTr("source", "disambiguation")
qsTr("source", "disambiguation", count) // count - some int value for source 
                                        // if it contains plurals - %n

让我们假设我们在源Qt或QML中找到了这一行:

代码语言:javascript
复制
qsTr("source string")

对于这种情况,我编写了一个Java正则表达式:

代码语言:javascript
复制
(?<=qsTr\\()(\\s*(\\".*?(?<\\\\)\\")?)(?=\\s*\\))

上面的regex将完全匹配“源字符串”,这是正确的。

但是我需要一个DOTALL正则表达式,而不仅仅是单行。

一个可能的问题是,我们可以找到下一个不正确的呼叫,我们应该忽略它:

代码语言:javascript
复制
qsTr("source", count)

由于贪婪的量词,上述正则表达式将失败。它将查找下一个"\\s*)"下整个文本。有什么办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-09 11:01:28

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

模式看起来就像

代码语言:javascript
复制
Pattern.compile("\\qsTr?\\s*\\(\\s*(((\".*?(?<!\\\\)\")|('.*?(?<!\\\\)')).*?)(?=\\))", Pattern.DOTALL);

它保证qsTr()包装的内容是否从“它将被完全提取”开始。例如,如果要解析下一个字符串:

代码语言:javascript
复制
qsTr("source", count)

你会得到下一个结果:

代码语言:javascript
复制
"source", count

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18145092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档