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 正規表現が必要です。

考えられる問題の 1 つは、正しくない次の呼び出しを見つけることができ、それを無視する必要があることです。

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 に答える