| (同じ利用者による、間の3版が非表示) | |||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
Qtでは、<code>QRegularExpression</code>クラスを使用して正規表現を扱う。<br> | |||
これは現代的な正規表現エンジンを提供しており、Perl互換の正規表現構文をサポートしている。<br> | |||
<br> | |||
<u>Qt 5.11以前まで使用されていたQRegExpクラスは現在非推奨となっている。</u><br> | |||
<br> | |||
基本的な使用方法としては、パターンマッチングとテキスト置換が主な用途である。<br> | |||
<br> | |||
パターンマッチングでは、文字列が特定のパターンに一致するかどうかを確認する。<br> | |||
例えば、Eメールアドレスの検証やURLの抽出等に活用できる。<br> | |||
<br> | |||
<code>QRegularExpression</code>クラスには、<u>大文字小文字を区別するオプション</u>、<u>複数行モードの有効化</u>等、様々なオプションを設定することができる。<br> | |||
これらのオプションは、パターンマッチングの動作を細かく制御するのに役立つ。<br> | |||
<br> | |||
マッチング結果は<code>QRegularExpressionMatch</code>オブジェクトとして返されて、マッチした部分文字列や位置情報等の詳細な情報を取得できる。<br> | |||
また、グループキャプチャを使用する場合は、パターン内の特定の部分にマッチした文字列を個別に取得することも可能である。<br> | |||
<br> | |||
正規表現のパターンが正しく構築されているかどうかを確認する場合は、<code>isValid</code>メソッドで事前に確認できる。<br> | |||
これは、実行時エラーを防ぐために重要である。<br> | |||
<br> | |||
<u>パフォーマンスにおいて、同じパターンを複数回使用する場合は、QRegularExpressionオブジェクトを再利用することを推奨する。</u><br> | |||
これにより、パターンの再コンパイルを避けることができる。<br> | |||
<br><br> | <br><br> | ||
== QRegularExpressionクラス (推奨) == | == QRegularExpressionクラス (推奨) == | ||
==== QRegularExpressionクラスとは ==== | |||
QRegularExpressionクラスは、PCREライブラリを基盤としており、以下に示すようなメリットがある。<br> | QRegularExpressionクラスは、PCREライブラリを基盤としており、以下に示すようなメリットがある。<br> | ||
* パフォーマンスの向上 | * パフォーマンスの向上 | ||
| 31行目: | 53行目: | ||
*: isValidメソッドを使用して、正規表現パターンの妥当性を確認することが推奨される。 | *: isValidメソッドを使用して、正規表現パターンの妥当性を確認することが推奨される。 | ||
<br> | <br> | ||
==== QRegularExpressionクラスの使用例 ==== | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include <QRegularExpression> | #include <QRegularExpression> | ||
| 161行目: | 184行目: | ||
QString code = "// This is a comment\nint x = 5;\n/* Multi\nline\ncomment */"; | QString code = "// This is a comment\nint x = 5;\n/* Multi\nline\ncomment */"; | ||
RegexExamples::extractComments(code); | RegexExamples::extractComments(code); | ||
</syntaxhighlight> | |||
<br> | |||
==== CaseInsensitiveOptionオプション ==== | |||
<syntaxhighlight lang="c++"> | |||
#include <QRegularExpression> | |||
#include <QDebug> | |||
QRegularExpression reCase("hello", QRegularExpression::CaseInsensitiveOption); | |||
QRegularExpressionMatch matchCase = reCase.match("HELLO world"); | |||
qDebug() << "Case insensitive match: " << matchCase.hasMatch(); // true | |||
</syntaxhighlight> | |||
<br> | |||
==== MultilineOptionオプション ==== | |||
<syntaxhighlight lang="c++"> | |||
#include <QRegularExpression> | |||
#include <QDebug> | |||
QString multilineText = "Line1\nLine2\nLine3"; | |||
QRegularExpression reMulti("^Line", QRegularExpression::MultilineOption); | |||
QRegularExpressionMatchIterator i = reMulti.globalMatch(multilineText); | |||
while (i.hasNext()) { | |||
QRegularExpressionMatch match = i.next(); | |||
qDebug() << "Found at position: " << match.capturedStart(); | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== キャプチャグループ (数値指定) ==== | |||
<syntaxhighlight lang="c++"> | |||
#include <QRegularExpression> | |||
#include <QDebug> | |||
QRegularExpression reGroup("(\\w+)=(\\d+)"); | |||
QRegularExpressionMatch matchGroup = reGroup.match("age=25"); | |||
if (matchGroup.hasMatch()) { | |||
qDebug() << "Full match: " << matchGroup.captured(0); // "age=25" | |||
qDebug() << "First group: " << matchGroup.captured(1); // "age" | |||
qDebug() << "Second group: " << matchGroup.captured(2); // "25" | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== 名前付きキャプチャグループ ==== | |||
<syntaxhighlight lang="c++"> | |||
#include <QRegularExpression> | |||
#include <QDebug> | |||
QRegularExpression reNamed("(?<key>\\w+)=(?<value>\\d+)"); | |||
QRegularExpressionMatch matchNamed = reNamed.match("count=42"); | |||
if (matchNamed.hasMatch()) { | |||
qDebug() << "Key: " << matchNamed.captured("key"); // "count" | |||
qDebug() << "Value: " << matchNamed.captured("value"); // "42" | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== マッチ位置の取得 ==== | |||
<syntaxhighlight lang="c++"> | |||
#include <QRegularExpression> | |||
#include <QDebug> | |||
QString text = "Hello, my email is test@example.com and phone is 123-456-7890"; | |||
// メールアドレスのパターン | |||
QRegularExpression emailRegex(R"(\b[\w\.-]+@[\w\.-]+\.\w+\b)"); | |||
// メールアドレスのマッチング | |||
QRegularExpressionMatch emailMatch = emailRegex.match(text); | |||
if (emailMatch.hasMatch()) { | |||
qDebug() << "Match text: " << emailMatch.captured(0); | |||
qDebug() << "Start position: " << emailMatch.capturedStart(); | |||
qDebug() << "Length: " << emailMatch.capturedLength(); | |||
qDebug() << "End position: " << emailMatch.capturedStart() + emailMatch.capturedLength(); | |||
} | |||
// 電話番号のパターン | |||
QRegularExpression phoneRegex(R"(\d{3}-\d{3}-\d{4})"); | |||
// 電話番号のマッチング | |||
QRegularExpressionMatch phoneMatch = phoneRegex.match(text); | |||
if (phoneMatch.hasMatch()) { | |||
qDebug() << "Match text: " << phoneMatch.captured(0); | |||
qDebug() << "Start position: " << phoneMatch.capturedStart(); | |||
qDebug() << "Length: " << phoneMatch.capturedLength(); | |||
qDebug() << "End position: " << phoneMatch.capturedStart() + phoneMatch.capturedLength(); | |||
} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | <br><br> | ||