QRegularExpression Class
QRegularExpression クラスは、正規表現を使ったパターン・マッチを提供します。詳細...
Header: | #include <QRegularExpression> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
qmake: | QT += core |
- 継承メンバを含むすべてのメンバのリスト
- 非推奨メンバー
- QRegularExpression は、暗黙的に共有されるクラスおよび文字列データのためのクラスの一部です。
このクラスは等価比較可能です。
注意:このクラスの関数はすべてリエントラントです。
パブリック型
enum | MatchOption { NoMatchOption, AnchoredMatchOption, AnchorAtOffsetMatchOption, DontCheckSubjectStringMatchOption } |
flags | MatchOptions |
enum | MatchType { NormalMatch, PartialPreferCompleteMatch, PartialPreferFirstMatch, NoMatch } |
enum | PatternOption { NoPatternOption, CaseInsensitiveOption, DotMatchesEverythingOption, MultilineOption, ExtendedPatternSyntaxOption, …, UseUnicodePropertiesOption } |
flags | PatternOptions |
(since 6.0) enum | WildcardConversionOption { DefaultWildcardConversion, UnanchoredWildcardConversion, NonPathWildcardConversion } |
flags | WildcardConversionOptions |
パブリック関数
QRegularExpression() | |
QRegularExpression(const QString &pattern, QRegularExpression::PatternOptions options = NoPatternOption) | |
QRegularExpression(const QRegularExpression &re) | |
(since 6.1) | QRegularExpression(QRegularExpression &&re) |
~QRegularExpression() | |
int | captureCount() const |
QString | errorString() const |
QRegularExpressionMatchIterator | globalMatch(const QString &subject, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const |
(since 6.5) QRegularExpressionMatchIterator | globalMatchView(QStringView subjectView, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const |
bool | isValid() const |
QRegularExpressionMatch | match(const QString &subject, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const |
(since 6.5) QRegularExpressionMatch | matchView(QStringView subjectView, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const |
QStringList | namedCaptureGroups() const |
void | optimize() const |
QString | pattern() const |
qsizetype | patternErrorOffset() const |
QRegularExpression::PatternOptions | patternOptions() const |
void | setPattern(const QString &pattern) |
void | setPatternOptions(QRegularExpression::PatternOptions options) |
void | swap(QRegularExpression &other) |
QRegularExpression & | operator=(QRegularExpression &&re) |
QRegularExpression & | operator=(const QRegularExpression &re) |
静的パブリックメンバ
QString | anchoredPattern(QStringView expression) |
QString | anchoredPattern(const QString &expression) |
QString | escape(QStringView str) |
QString | escape(const QString &str) |
(since 6.0) QRegularExpression | fromWildcard(QStringView pattern, Qt::CaseSensitivity cs = Qt::CaseInsensitive, QRegularExpression::WildcardConversionOptions options = DefaultWildcardConversion) |
QString | wildcardToRegularExpression(QStringView pattern, QRegularExpression::WildcardConversionOptions options = DefaultWildcardConversion) |
QString | wildcardToRegularExpression(const QString &pattern, QRegularExpression::WildcardConversionOptions options = DefaultWildcardConversion) |
関連非会員
size_t | qHash(const QRegularExpression &key, size_t seed = 0) |
bool | operator!=(const QRegularExpression &lhs, const QRegularExpression &rhs) |
QDataStream & | operator<<(QDataStream &out, const QRegularExpression &re) |
QDebug | operator<<(QDebug debug, QRegularExpression::PatternOptions patternOptions) |
QDebug | operator<<(QDebug debug, const QRegularExpression &re) |
bool | operator==(const QRegularExpression &lhs, const QRegularExpression &rhs) |
QDataStream & | operator>>(QDataStream &in, QRegularExpression &re) |
詳細説明
正規表現(regexps)は、文字列やテキストを扱うための非常に強力なツールである。これは多くの文脈で有用である、
検証 | 正規表現では、部分文字列がある基準を満たしているかどうかをテストすることができます。 |
検索 | 正規表現は、単純な部分文字列マッチングよりも強力なパターンマッチを提供します。例えば、mail、letter、correspondenceのどれかにマッチし、email、mailman、mailer、letterboxのどれにもマッチしない場合などです。 |
検索と置換 | 正規表現では、ある部分文字列のすべてを別の部分文字列に置き換えることができます。例えば、&の後にすでにamp;が付いている場合を除き、&のすべてを&に置き換えることができます。 |
文字列の分割 | 正規表現を使って、文字列を分割する箇所を特定することができます(タブ区切りの文字列の分割など)。 |
このドキュメントは正規表現を使ったパターン・マッチの完全なリファレンスではありません。
正規表現に関する良い参考文献は以下の通りです:
- ジェフリー・E・F・フリードル著「Mastering Regular Expressions(Third Edition)」ISBN 0-596-52812-4;
- pcrepattern(3)のマニュアルページで、PCRE(Perl互換正規表現のリファレンス実装)がサポートするパターン構文を説明しています;
- Perlの正規表現のドキュメントと Perlの正規表現のチュートリアル。
はじめに
QRegularExpression は Perl 互換の正規表現を実装しています。Unicodeを完全にサポートしています。QRegularExpression がサポートする正規表現の構文の概要については、前述の pcrepattern(3) man ページを参照してください。正規表現は、パターン文字列と、パターン文字列の意味を変更するパターン・オプションのセットの2つで構成されます。
パターン文字列を設定するには、QRegularExpressionコンストラクタに文字列を渡します:
QRegularExpression re("a pattern");
これは、パターン文字列をa pattern
に設定します。また、setPattern() 関数を使用して、既存の QRegularExpression オブジェクトにパターンを設定することもできます:
QRegularExpression re; re.setPattern("another pattern");
C++ リテラル文字列の規則により、パターン文字列内のすべてのバックスラッシュを別のバックスラッシュでエスケープする必要があることに注意してください:
// matches two digits followed by a space and a word QRegularExpression re("\\d\\d \\w+"); // matches a backslash QRegularExpression re2("\\\\");
この場合、パターン内のバックスラッシュをエスケープする必要はなく、R"(...)"
の間の文字はすべて生の文字とみなされます。次の例でわかるように、これでパターンを書くのが簡単になります:
// matches two digits followed by a space and a word QRegularExpression re(R"(\d\d \w+)");
pattern() 関数は、QRegularExpression オブジェクトに現在設定されているパターンを返します:
QRegularExpression re("a third pattern"); QString pattern = re.pattern(); // pattern == "a third pattern"
パターン・オプション
パターン文字列の意味は、1 つ以上のパターン・オプションを設定することで変更できます。たとえば、QRegularExpression::CaseInsensitiveOption.
オプションを設定するには、QRegularExpression コンストラクタに次のように渡します:
// matches "Qt rocks", but also "QT rocks", "QT ROCKS", "qT rOcKs", etc. QRegularExpression re("Qt rocks", QRegularExpression::CaseInsensitiveOption);
または、既存の QRegularExpressionObject に対してsetPatternOptions() 関数を使用することもできます:
QRegularExpression re("^\\d+$"); re.setPatternOptions(QRegularExpression::MultilineOption); // re matches any line in the subject string that contains only digits (but at least one)
patternOptions() 関数を使用すると、QRegularExpression オブジェクトに現在設定されているパターン・オプションを取得できます:
QRegularExpression re = QRegularExpression("^two.*words$", QRegularExpression::MultilineOption | QRegularExpression::DotMatchesEverythingOption); QRegularExpression::PatternOptions options = re.patternOptions(); // options == QRegularExpression::MultilineOption | QRegularExpression::DotMatchesEverythingOption
各パターン・オプションの詳細については、QRegularExpression::PatternOption enum ドキュメントを参照してください。
マッチ・タイプとマッチ・オプション
match() とglobalMatch() 関数の最後の2つの引数は、マッチタイプとマッチオプションを設定します。マッチタイプはQRegularExpression::MatchType enum の値です。"伝統的な" マッチングアルゴリズムはNormalMatch マッチタイプ (デフォルト) を使って選択されます。対象文字列に対する正規表現の部分マッチを有効にすることもできます: 詳細はpartial matching セクションを参照してください。
マッチオプションは、1つ以上のQRegularExpression::MatchOption 値の集合です。これらは、主題文字列に対する正規表現の特定のマッチの方法を変更します。詳細はQRegularExpression::MatchOption enum documentationを参照してください。
通常のマッチング
マッチングを行うには、match() 関数にマッチする文字列を 渡して呼び出すだけです。この文字列を件名文字列と呼びます。match() 関数の結果はQRegularExpressionMatch オブジェクトで、これを使用してマッチの結果を調べることができます。例えば
// match two digits followed by a space and a word QRegularExpression re("\\d\\d \\w+"); QRegularExpressionMatch match = re.match("abc123 def"); bool hasMatch = match.hasMatch(); // true
マッチが成功した場合、(暗黙の)捕捉グループ番号0を使用して、パターン全体でマッチした部分文字列を取り出すことができます(extracting captured substrings のセクションも参照してください):
QRegularExpression re("\\d\\d \\w+"); QRegularExpressionMatch match = re.match("abc123 def"); if (match.hasMatch()) { QString matched = match.captured(0); // matched == "23 def" // ... }
また、match()関数の引数としてオフセットを渡すことで、対象文字列内の任意のオフセットからマッチを開始することも可能です。以下の例では、"12 abc"
はオフセット 1 からマッチが開始されるため、マッチしません:
QRegularExpression re("\\d\\d \\w+"); QRegularExpressionMatch match = re.match("12 abc 45 def", 1); if (match.hasMatch()) { QString matched = match.captured(0); // matched == "45 def" // ... }
キャプチャされた部分文字列の抽出
QRegularExpressionMatch オブジェクトは、パターン文字列内の捕捉グループによって捕捉された部分文字列に関する情報も含んでいます。captured() 関数は、n番目の捕捉グループによって捕捉された文字列を返します:
QRegularExpression re("^(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)$"); QRegularExpressionMatch match = re.match("08/12/1985"); if (match.hasMatch()) { QString day = match.captured(1); // day == "08" QString month = match.captured(2); // month == "12" QString year = match.captured(3); // year == "1985" // ... }
パターン内の捕捉グループには1から番号が振られており、暗黙の捕捉グループ0は、パターン全体にマッチした部分文字列を捕捉するために使用されます。
また、capturedStart ()とcapturedEnd ()関数を使用することで、キャプチャされた部分文字列の開始オフセットと終了オフセット(対象文字列内)を取得することも可能です:
QRegularExpression re("abc(\\d+)def"); QRegularExpressionMatch match = re.match("XYZabc123defXYZ"); if (match.hasMatch()) { int startOffset = match.capturedStart(1); // startOffset == 6 int endOffset = match.capturedEnd(1); // endOffset == 9 // ... }
これらの関数はすべて、QString をパラメータとするオーバーロードを持っており、名前付きキャプチャ部分文字列を抽出することができます。例えば
QRegularExpression re("^(?<date>\\d\\d)/(?<month>\\d\\d)/(?<year>\\d\\d\\d\\d)$"); QRegularExpressionMatch match = re.match("08/12/1985"); if (match.hasMatch()) { QString date = match.captured("date"); // date == "08" QString month = match.captured("month"); // month == "12" QString year = match.captured("year"); // year == 1985 }
グローバル・マッチング
グローバル・マッチングは、対象の文字列の中で指定された正規表現が出現する箇所をすべて見つけるのに便利です。与えられた文字列からすべての単語を抽出したいとします。単語はパターン\w+
にマッチする部分文字列です。
QRegularExpression::globalMatch QRegularExpressionMatchIteratorこれはJavaのような順方向イテレータで、結果を反復処理するのに使用できる。例えば
QRegularExpression re("(\\w+)"); QRegularExpressionMatchIterator i = re.globalMatch("the quick fox");
Javaライクなイテレータなので、QRegularExpressionMatchIterator は最初の結果の直前を指す。すべての結果は、QRegularExpressionMatch オブジェクトとして返されます。hasNext()関数は、少なくとももう1つ結果があれば真を返し、next()は次の結果を返してイテレーターを進めます。前の例の続きです:
QStringList words; while (i.hasNext()) { QRegularExpressionMatch match = i.next(); QString word = match.captured(1); words << word; } // words contains "the", "quick", "fox"
イテレータを進めずに次の結果を取得するには、peekNext() を使用することもできます。
また、QRegularExpression::globalMatch の結果を範囲ベースの for ループで使用することもできます:
// using a raw string literal, R"(raw_characters)", to be able to use "\w" // without having to escape the backslash as "\\w" QRegularExpression re(R"(\w+)"); QString subject("the quick fox"); for (const QRegularExpressionMatch &match : re.globalMatch(subject)) { // ... }
match() を使った通常のマッチングとまったく同じように、開始オフセットと 1 つ以上のマッチ・オプションをglobalMatch() 関数に渡すことができます。
部分マッチング
部分マッチは、対象文字列の末尾に達したが、マッチを成功させるためにさらに文字が必要な場合に得られます。部分マッチは、マッチング・アルゴリズムの多くの最適化ができないため、 通常、通常のマッチよりもはるかに非効率的であることに注意してください。
部分一致は、QRegularExpression::match またはQRegularExpression::globalMatch を呼び出すときに、PartialPreferCompleteMatch またはPartialPreferFirstMatch のマッチタイプを指定して明示的に要求する必要がある。 部分一致が見つかった場合、match() が返すQRegularExpressionMatch オブジェクトに対してhasMatch() 関数を呼び出すと、false
が返されるが、hasPartialMatch() はtrue
が返される。
部分一致が見つかった場合、キャプチャされた部分文字列は返されず、全体一致に対応する (暗黙の)キャプチャグループ0が、部分一致した対象文字列の部分文字列をキャプチャする。
部分一致を要求しても、完全一致が見つかれば、完全一致になることに注意。この場合、hasMatch() はtrue
を返し、hasPartialMatch() はfalse
を返す。QRegularExpressionMatch が部分一致と完全一致の両方を報告することはない。
部分一致は主に、リアルタイムでのユーザー入力の検証と、インクリメンタル/マルチセグメント・マッチングの2つのシナリオで有用である。
ユーザー入力の検証
たとえば "MMM dd, yyyy "のように、特定のフォーマットで日付を入力させたいとする。入力の妥当性は、次のようなパターンでチェックできる:
^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d\d?, \d\d\d\d$
(このパターンでは無効な日は検出されませんが、この例のために残しておきましょう)。
ユーザーが入力をタイプしている間に、この正規表現で入力を検証して、入力がコミットされるとすぐにエラーを報告できるようにしたいと思います(たとえば、ユーザーが間違ったキーをタイプした場合など)。そのためには、3つのケースを区別しなければならない:
- 入力が正規表現にマッチしない;
- 入力が正規表現にマッチする;
- 入力は今は正規表現にマッチしないが、文字が追加されればマッチする。
これらの3つのケースは、まさにQValidator (QValidator::State enumを参照)の可能な状態を表していることに注意してください。
特に、最後のケースでは、正規表現エンジンに部分一致を報告させたい: subject文字列に対するパターンのマッチングには成功しているが、 subjectの最後に遭遇したため、マッチングを続けることができない。しかし、マッチングアルゴリズムはすべての可能性を試し続け、完全な(部分的でない)マッチが見つかった場合、このマッチを報告し、入力文字列を完全に有効なものとして受け入れるべきであることに注意してください。
この動作は、PartialPreferCompleteMatch マッチ・タイプによって実装されている。例えば
QString pattern("^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \\d\\d?, \\d\\d\\d\\d$"); QRegularExpression re(pattern); QString input("Jan 21,"); QRegularExpressionMatch match = re.match(input, 0, QRegularExpression::PartialPreferCompleteMatch); bool hasMatch = match.hasMatch(); // false bool hasPartialMatch = match.hasPartialMatch(); // true
同じ正規表現をサブジェクト文字列にマッチさせると完全一致になる場合は、通常通り報告されます:
QString input("Dec 8, 1985"); QRegularExpressionMatch match = re.match(input, 0, QRegularExpression::PartialPreferCompleteMatch); bool hasMatch = match.hasMatch(); // true bool hasPartialMatch = match.hasPartialMatch(); // false
別のパターンによる別の例では、部分一致よりも完全一致を優先する挙動を示している:
QRegularExpression re("abc\\w+X|def"); QRegularExpressionMatch match = re.match("abcdef", 0, QRegularExpression::PartialPreferCompleteMatch); bool hasMatch = match.hasMatch(); // true bool hasPartialMatch = match.hasPartialMatch(); // false QString captured = match.captured(0); // captured == "def"
この場合、サブパターンabc\\w+X
はサブジェクト文字列と部分的にマッチします。しかし、サブパターンdef
はサブジェクト文字列と完全にマッチするため、完全なマッチが報告されます。
マッチング時に複数の部分一致が見つかった場合 (完全一致は見つからなかった場合)、QRegularExpressionMatch オブジェクトは最初に見つかったものを報告します。例えば
QRegularExpression re("abc\\w+X|defY"); QRegularExpressionMatch match = re.match("abcdef", 0, QRegularExpression::PartialPreferCompleteMatch); bool hasMatch = match.hasMatch(); // false bool hasPartialMatch = match.hasPartialMatch(); // true QString captured = match.captured(0); // captured == "abcdef"
インクリメンタル/マルチセグメントマッチング
インクリメンタル・マッチングも部分マッチングの使用例である。大きなテキストの中にある正規表現の出現箇所(つまり、正規表現にマッチする部分文字列)を見つけたいとする。そのためには、大きなテキストを小さな塊にして正規表現エンジンに「供給」したい。明らかな問題は、正規表現にマッチする部分文字列が2つ以上のチャンクにまたがる場合にどうなるかです。
この場合、正規表現エンジンは部分一致を報告し、新しいデータを追加して再度マッチさせ、(最終的に)完全一致を得ることができるはずです。このことは、正規表現エンジンが、対象文字列の末尾以外にも文字があると仮定する可能性があることを意味する。これは文字通りの意味ではなく、エンジンはサブジェクトの最後の文字以降の文字にアクセスしようとすることはありません。
QRegularExpression は、PartialPreferFirstMatch マッチ・タイプを使用するときにこの動作を実装します。このマッチタイプは、部分一致が見つかるとすぐにそれを報告し、他のマッチの選択肢は(完全一致につながる可能性があっても)試されません。たとえば
QRegularExpression re("abc|ab"); QRegularExpressionMatch match = re.match("ab", 0, QRegularExpression::PartialPreferFirstMatch); bool hasMatch = match.hasMatch(); // false bool hasPartialMatch = match.hasPartialMatch(); // true
これは、alternation operatorの最初のブランチにマッチしたときに部分一致が見つかり、マッチングが停止して、2番目のブランチが試されないために起こります。もうひとつの例:
QRegularExpression re("abc(def)?"); QRegularExpressionMatch match = re.match("abc", 0, QRegularExpression::PartialPreferFirstMatch); bool hasMatch = match.hasMatch(); // false bool hasPartialMatch = match.hasPartialMatch(); // true
?
は貪欲なので、エンジンはまず、"abc"
にマッチした後、マッチを継続しようとします。しかし、その後、マッチは対象文字列の最後に到達するので、部分一致が報告されます。これは次の例ではさらに驚くべきことです:
QRegularExpression re("(abc)*"); QRegularExpressionMatch match = re.match("abc", 0, QRegularExpression::PartialPreferFirstMatch); bool hasMatch = match.hasMatch(); // false bool hasPartialMatch = match.hasPartialMatch(); // true
エンジンは主語文字列が、マッチを探そうとしているテキスト全体の部分文字列だけであることを想定していることを思い出せば、この動作を理解するのは簡単です(つまり、前に述べたように、エンジンは主語文字列の末尾の先にも他の文字があることを想定しているのです)。
*
"abc"
"abc"
たとえば、完全なテキストは "abcabcX "であったかもしれず、したがって(完全なテキストで)報告すべき正しいマッチは"abcabc"
であったでしょう;先頭の"abc"
に対してのみマッチすることで、代わりに部分的なマッチが得られます。
エラー処理
パターン文字列の構文エラーにより、QRegularExpression オブジェクトが無効になることがあります。isValid() 関数は正規表現が有効であれば真を、そうでなければ偽を返します:
QRegularExpression invalidRe("(unmatched|parenthesis"); bool isValid = invalidRe.isValid(); // false
errorStringさらに、patternErrorOffset() 関数は、パターン文字列内のオフセットを返します。
QRegularExpression invalidRe("(unmatched|parenthesis"); if (!invalidRe.isValid()) { QString errorString = invalidRe.errorString(); // errorString == "missing )" int errorOffset = invalidRe.patternErrorOffset(); // errorOffset == 22 // ... }
無効な QRegularExpression とのマッチが試みられた場合、返されるQRegularExpressionMatch オブジェクトも同様に無効です (つまり、isValid() 関数は false を返します)。グローバル一致を試みる場合も同様です。
サポートされていない Perl 互換の正規表現機能
QRegularExpression は Perl 互換の正規表現で利用可能なすべての機能をサポートしているわけではありません。最も顕著なものは、グループをキャプチャするための重複した名前がサポートされておらず、それらを使用すると未定義の動作につながる可能性があるという事実です。
これは Qt の将来のバージョンで変更される可能性があります。
QRegularExpression を使用するコードのデバッグ
QRegularExpression は、マッチング・アルゴリズムの実行を最適化するために、内部的にジャスト・イン・タイム・コンパイラ(JIT)を使用します。JIT は自己修正コードを広範囲に使用するため、Valgrind などのデバッグ・ツールがクラッシュする可能性があります。QRegularExpression(例えば、Valgrindの--smc-check
コマンドラインオプション)を使用してプログラムをデバッグしたい場合は、自己修正コードのチェックをすべて有効にする必要があります。このようなチェックを有効にすることの欠点は、プログラムの実行速度がかなり遅くなることです。
それを避けるために、デバッグモードでQtをコンパイルする場合、JITはデフォルトで無効になります。QT_ENABLE_REGEXP_JIT
デバッグモードでもリリースモードでも)デフォルトをオーバーライドして、JITの使用を有効または無効にすることができます。
QRegularExpressionMatch およびQRegularExpressionMatchIteratorも参照して ください。
メンバ型ドキュメント
enum QRegularExpression::MatchOption
flags QRegularExpression::MatchOptions
定数 | 値 | 説明 |
---|---|---|
QRegularExpression::NoMatchOption | 0x0000 | マッチオプションは設定されていません。 |
QRegularExpression::AnchoredMatchOption | AnchorAtOffsetMatchOption | 代わりに AnchorAtOffsetMatchOption を使用します。 |
QRegularExpression::AnchorAtOffsetMatchOption | 0x0001 | パターン文字列が、その時点でマッチをアンカーするメタキャラクタを含んでいなくても、マッチが成功するためには、match() に渡されたオフセットで正確に開始するように拘束されます。このオプションを渡すと、マッチの終わりを件名の終わりに固定しないことに注意。正規表現に完全に固定したい場合は、anchoredPattern() を使用する。このenum値はQt 6.0で導入されました。 |
QRegularExpression::DontCheckSubjectStringMatchOption | 0x0002 | サブジェクト文字列は、マッチを試みる前にUTF-16の妥当性がチェックされません。無効な文字列をマッチさせようとすると、プログラムがクラッシュしたり、セキュリティ上の問題が発生したりする可能性があるため、このオプションは十分に注意して使用してください。この列挙値は Qt 5.4 で導入されました。 |
MatchOptions 型はQFlags<MatchOption> の typedef です。MatchOption 値の OR の組み合わせを格納します。
enum QRegularExpression::MatchType
MatchType 列挙型は、対象の文字列に対して試行されるべきマッチのタイプを定義します。
定数 | 値 | 説明 |
---|---|---|
QRegularExpression::NormalMatch | 0 | 通常のマッチが行われます。 |
QRegularExpression::PartialPreferCompleteMatch | 1 | パターン文字列は部分的に対象文字列とマッチします。部分一致が見つかった場合、それは記録され、他のマッチングが通常通り試されます。完全一致が見つかった場合、それは部分一致よりも優先されます。その代わりに完全一致が見つからなかった場合(部分一致のみ)、部分一致が報告される。 |
QRegularExpression::PartialPreferFirstMatch | 2 | パターン文字列は、サブジェクト文字列と部分的にマッチします。部分一致が見つかった場合、マッチングは停止し、部分一致が報告されます。この場合、(完全一致につながる可能性のある)他のマッチングは試されません。さらに、このマッチ・タイプは、件名文字列がより大きなテキストの部分文字列にすぎず、 (このテキストでは)件名文字列の末尾の先に他の文字があることを想定しています。詳細はpartial matching セクションの説明を参照のこと。 |
QRegularExpression::NoMatch | 3 | マッチは行われません。この値は、デフォルトで構築されたQRegularExpressionMatch またはQRegularExpressionMatchIterator によってマッチタイプとして返されます。 このマッチタイプを使ってもマッチは起こらないので、ユーザーにとってはあまり有益ではありません。この enum 値は Qt 5.1 で導入されました。 |
enum QRegularExpression::PatternOption
flags QRegularExpression::PatternOptions
PatternOption 列挙型は、パターン文字列の解釈方法、つまり対象文字列に対するパターンのマッチ方法に対する修飾子を定義します。
定数 | 値 | 説明 |
---|---|---|
QRegularExpression::NoPatternOption | 0x0000 | パターンオプションは設定されません。 |
QRegularExpression::CaseInsensitiveOption | 0x0001 | このパターンは、大文字小文字を区別せずに件名の文字列とマッチします。このオプションは、Perlの正規表現における/i修飾子に相当します。 |
QRegularExpression::DotMatchesEverythingOption | 0x0002 | パ タ ーン文字列内の メ タ キ ャ ラ ク タ ド ッ ト (. ) は、 改行を含め、 サブジ ェ ク ト 文字列内の任意の文字 と マ ッ チで き ます (通常、 ド ッ ト は改行 と マ ッ チ し ません)。このオプションは、Perl正規表現における/s 修飾子に相当します。 |
QRegularExpression::MultilineOption | 0x0004 | パターン文字列のキャレット (^ ) とドル ($ ) メタキャラクタは、それぞれ、サブジェクト文字列の改行の直後と直前、およびサブジェクト文字列の先頭と末尾にマッチする。このオプションはPerl正規表現における/m 修飾子に相当する。 |
QRegularExpression::ExtendedPatternSyntaxOption | 0x0008 | パターン文字列中のエスケープされていない文字クラス外の空白は無視されます。さらに、文字クラス外のエスケープされていないシャープ(#)は、最初の改行(インクルード)までのすべての後続文字を無視するようになります。これは、パターン文字列の可読性を高めるだけでなく、正規表現内にコメントを記述するために使用できます。これは、パターン文字列がファイルから読み込まれるか、ユーザーによって記述される場合に特に有用です。C++コードでは、文字列リテラルの規則を使用してパターン文字列の外側にコメントを記述することが常に可能だからです。このオプションは、Perl正規表現における/x 修飾子に相当します。 |
QRegularExpression::InvertedGreedinessOption | 0x0010 | 量化子の貪欲さは反転されます:* + ,? ,{m,n} , などはlazyになり、それらのlazyバージョン(*? ,+? ,?? ,{m,n}? , など)は貪欲になる。Perl正規表現には、このオプションに相当するものはありません。 |
QRegularExpression::DontCaptureOption | 0x0020 | 名前なし捕捉グループは部分文字列を捕捉しません。名前付き捕捉グループは、マッチ全体に対応する暗黙の捕捉グループ番号0と同様に、意図したとおりに動作します。Perl正規表現では、このオプションに相当するものはありません。 |
QRegularExpression::UseUnicodePropertiesOption | 0x0040 | \w 、\d などの文字クラスの意味と、その対応するもの (\W 、\D など) の意味が、ASCII文字のみのマッチから、対応するUnicodeプロパティを持つ任意の文字とのマッチに変更されました。例えば、\d は、Unicode Nd (10進数)プロパティを持つあらゆる文字にマッチするように変更されます。\w は、Unicode L (文字) または N (数字)プロパティのいずれかとアンダースコアを持つあらゆる文字にマッチするように変更されます。このオプションはPerl正規表現における/u 修飾子に相当します。 |
PatternOptions 型はQFlags<PatternOption> の typedef です。PatternOption値のORの組み合わせを格納します。
[since 6.0]
enum QRegularExpression::WildcardConversionOption
flags QRegularExpression::WildcardConversionOptions
WildcardConversionOption 列挙型は、ワイルドカードグロブパターンを正規表現パターンに変換する方法の修飾子を定義します。
定数 | 値 | 説明 |
---|---|---|
QRegularExpression::DefaultWildcardConversion | 0x0 | 変換オプションは設定されません。 |
QRegularExpression::UnanchoredWildcardConversion | 0x1 | 変換はパターンを固定しません。これは,ワイルドカード表現の部分的な文字列マッチを可能にする。 |
QRegularExpression::NonPathWildcardConversion (since Qt 6.6) | 0x2 | 変換はパターンをファイルパス・グロビングとして解釈しません。 |
この列挙型は Qt 6.0 で導入されました。
WildcardConversionOptions 型はQFlags<WildcardConversionOption> の typedef です。WildcardConversionOption 値の OR の組み合わせを格納します。
メンバ関数の説明
QRegularExpression::QRegularExpression()
空のパターンとパターン・オプションを持たない QRegularExpression オブジェクトを構築します。
setPattern() およびsetPatternOptions()も参照して ください。
[explicit]
QRegularExpression::QRegularExpression(const QString &pattern, QRegularExpression::PatternOptions options = NoPatternOption)
指定されたpattern をパターンとして使用し、options をパターン・オプションとして使用して QRegularExpression オブジェクトを構築します。
setPattern() およびsetPatternOptions() も参照して ください。
[noexcept]
QRegularExpression::QRegularExpression(const QRegularExpression &re)
re のコピーとして QRegularExpression オブジェクトを構築します。
operator=()も参照して ください。
[noexcept, since 6.1]
QRegularExpression::QRegularExpression(QRegularExpression &&re)
re から移動して QRegularExpression オブジェクトを構築します。
移動元の QRegularExpression は、破棄または代入のみが可能であることに注意してください。デストラクタや代入演算子以外の関数を呼び出した場合の効果は未定義です。
この関数は Qt 6.1 で導入されました。
operator=()も参照してください 。
[noexcept]
QRegularExpression::~QRegularExpression()
QRegularExpression オブジェクトを破棄します。
[static]
QString QRegularExpression::anchoredPattern(QStringView expression)
\A
と\z
のアンカーの間にラップされたexpression を返します。
[static]
QString QRegularExpression::anchoredPattern(const QString &expression)
これはオーバーロードされた関数です。
int QRegularExpression::captureCount() const
パターン文字列内の捕捉グループの数、または正規表現が有効でない場合は -1 を返します。
注意: 暗黙の捕捉グループ 0 は、返される数に含まれない。
isValid()も参照 。
QString QRegularExpression::errorString() const
正規表現の妥当性をチェックした際に見つかったエラーの説明をテキストで返すか、 エラーが見つからなかった場合は "no error" を返します。
isValid() およびpatternErrorOffset() も参照 。
[static]
QString QRegularExpression::escape(QStringView str)
str のすべての文字をエスケープして、正規表現のパターン文字列として使用する際に特別な意味を持たないようにし、エスケープされた文字列を返します。例えば
QString escaped = QRegularExpression::escape("a(x) = f(x) + g(x)"); // escaped == "a\\(x\\)\\ \\=\\ f\\(x\\)\\ \\+\\ g\\(x\\)"
これは、任意の文字列からパターンを構築するのに非常に便利です:
QString pattern = "(" + QRegularExpression::escape(name) + "|" + QRegularExpression::escape(nickname) + ")"; QRegularExpression re(pattern);
注: この関数はPerlのquotemetaアルゴリズムを実装しており、[A-Z]
、[a-z]
、[0-9]
の範囲の文字とアンダースコア(_
)文字を除き、str のすべての文字をバックスラッシュでエスケープします。Perlとの唯一の違いは、str 内のリテラル NUL が、"\\\0"
(バックスラッシュ +NUL
)ではなく、"\\0"
(バックスラッシュ +'0'
)というシーケンスでエスケープされることです。
[static]
QString QRegularExpression::escape(const QString &str)
これはオーバーロードされた関数です。
[static, since 6.0]
QRegularExpression QRegularExpression::fromWildcard(QStringView pattern, Qt::CaseSensitivity cs = Qt::CaseInsensitive, QRegularExpression::WildcardConversionOptions options = DefaultWildcardConversion)
グロブパターンpattern の正規表現を返します。この正規表現は、cs がQt::CaseSensitive の場合は大文字小文字を区別し、options の場合は大文字小文字を区別して変換されます。
と同等です。
auto reOptions = cs == Qt::CaseSensitive ? QRegularExpression::NoPatternOption : QRegularExpression::CaseInsensitiveOption; return QRegularExpression(wildcardToRegularExpression(str, options), reOptions);
この関数は Qt 6.0 で導入されました。
QRegularExpressionMatchIterator QRegularExpression::globalMatch(const QString &subject, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const
与えられたsubject 文字列に対して、matchType 型のマッチを使用して、与えられたmatchOptions を尊重しながら、サブジェクト内のoffset の位置から始まる正規表現のグローバルマッチを試みます。
返されるQRegularExpressionMatchIterator は、最初のマッチ結果 (もしあれば) の前に置かれます。
QRegularExpressionMatchIterator およびglobal matchingも参照してください 。
[since 6.5]
QRegularExpressionMatchIterator QRegularExpression::globalMatchView(QStringView subjectView, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const
これはオーバーロードされた関数です。
与えられたsubjectView 文字列ビューに対して、matchType 型のマッチを使用し、与えられたmatchOptions を尊重して、サブジェクト内のoffset の位置から始まる正規表現のグローバルマッチを試みます。
返されるQRegularExpressionMatchIterator は、最初のマッチ結果(もしあれば)の前に配置されます。
注意: subjectView によって参照されるデータは、それを使用しているQRegularExpressionMatchIterator またはQRegularExpressionMatch オブジェクトがある限り、有効であり続けなければなりません。
この関数は Qt 6.5 で導入されました。
QRegularExpressionMatchIterator およびglobal matchingも参照してください 。
bool QRegularExpression::isValid() const
正規表現が有効な正規表現(つまり、構文エラーなどを含まない)であればtrue
を返し、そうでなければ false を返します。エラーのテキストによる説明を得るにはerrorString() を使用する。
errorString() およびpatternErrorOffset()も参照のこと 。
QRegularExpressionMatch QRegularExpression::match(const QString &subject, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const
与えられたsubject 文字列に対して、matchType 型のマッチを使用し、与えられたmatchOptions を尊重しながら、サブジェクト内の位置offset から始まる正規表現とのマッチを試みます。
返されるQRegularExpressionMatch オブジェクトには、マッチの結果が含まれます。
QRegularExpressionMatch およびnormal matchingも参照してください 。
[since 6.5]
QRegularExpressionMatch QRegularExpression::matchView(QStringView subjectView, qsizetype offset = 0, QRegularExpression::MatchType matchType = NormalMatch, QRegularExpression::MatchOptions matchOptions = NoMatchOption) const
これはオーバーロードされた関数です。
与えられたsubjectView 文字列ビューに対して、matchType 型のマッチを使用し、与えられたmatchOptions を尊重しながら、サブジェクト内のoffset の位置から始まる正規表現とのマッチを試みます。
返されるQRegularExpressionMatch オブジェクトには、マッチの結果が含まれます。
注意: subjectView によって参照されるデータは、それを使用しているQRegularExpressionMatch オブジェクトがある限り、有効であり続けなければなりません。
この関数は Qt 6.5 で導入されました。
QRegularExpressionMatch およびnormal matchingも参照してください 。
QStringList QRegularExpression::namedCaptureGroups() const
パターン文字列内の名前付きキャプチャグループの名前を含む、captureCount() + 1 要素のリストを返します。このリストは、i
の位置にあるリストの要素が、i
-番目のキャプチャグループの名前になるようにソートされます。
例えば、正規表現
(?<day>\d\d)-(?<month>\d\d)-(?<year>\d\d\d\d) (\w+) (?<name>\w+)
namedCaptureGroups()は以下のリストを返します:
("", "day", "month", "year", "", "name")
これは、キャプチャグループ#0(マッチ全体に対応)には名前がなく、 キャプチャグループ#1には "day"、キャプチャグループ#2には "month "などの名前があることに対応します。
正規表現が有効でない場合は、空のリストを返します。
isValid(),QRegularExpressionMatch::captured(),QString::isEmpty()も参照のこと 。
void QRegularExpression::optimize() const
JITが有効な場合は)最適化のためのJITコンパイルも含めて、パターンを即座にコンパイルします。
isValid() およびDebugging Code that Uses QRegularExpression も参照 。
QString QRegularExpression::pattern() const
正規表現のパターン文字列を返します。
setPattern() およびpatternOptions() も参照 。
qsizetype QRegularExpression::patternErrorOffset() const
正規表現の有効性をチェックする際にエラーが見つかったパターン文字列内のオフセットを返します。エラーが見つからなかった場合は -1 が返されます。
pattern()、isValid()、errorString()も参照 。
QRegularExpression::PatternOptions QRegularExpression::patternOptions() const
正規表現のパターン・オプションを返します。
setPatternOptions() およびpattern() も参照 。
void QRegularExpression::setPattern(const QString &pattern)
正規表現のパターン文字列をpattern に設定します。 パターン・オプションは変更されません。
pattern() およびsetPatternOptions() も参照 。
void QRegularExpression::setPatternOptions(QRegularExpression::PatternOptions options)
指定されたoptions を正規表現のパターン・オプションに設定します。パターン文字列は変更されません。
patternOptions() およびsetPattern() も参照 。
[noexcept]
void QRegularExpression::swap(QRegularExpression &other)
正規表現other をこの正規表現と入れ替えます。この操作は非常に高速で、失敗することはありません。
[static]
QString QRegularExpression::wildcardToRegularExpression(QStringView pattern, QRegularExpression::WildcardConversionOptions options = DefaultWildcardConversion)
与えられたグロブの正規表現pattern を返します。
ファイルパスのグロブを対象とした変換と、より汎用的な変換の2つがあります。
デフォルトでは、ファイルパスのグロビングを対象とした変換が行われ、特にパス区切り文字が特別な扱いを受けることになります。これは、"*"から".*"などへの基本的な変換だけではないことを意味する。
QString wildcard = QRegularExpression::wildcardToRegularExpression("*.jpeg"); // Will match files with names like: // foo.jpeg // f_o_o.jpeg // föö.jpeg
より汎用的なグロビング変換は、変換options でNonPathWildcardConversion
を渡すことで利用できる。
この実装は、グロブパターンのワイルドカードの定義に忠実に従っている:
c | cは、後述の文字とは別に、任意の文字自身を表します。したがって、cは文字cにマッチする。 |
? | パス区切り文字を除く任意の1文字にマッチします(ファイル・パス・グロブが選択されている場合)。完全正規表現におけるb{.}と同じです。 |
* | パス区切り文字を除く0文字以上の任意の文字にマッチします(ファイル・パス・グロビングが選択されている場合)。完全正規表現における.*と同じです。 |
[abc] | ブラケットで指定された1文字にマッチします。 |
[a-c] | ブラケットで指定された範囲から1文字にマッチします。 |
[abc] | ブラケットで指定されていない1文字にマッチします。完全正規表現における[^abc]と同じです。 |
[a-c] | 括弧で指定された範囲以外の1文字にマッチする。完全な正規表現では[^a-c]と同じです。 |
注意: 歴史的な理由により、バックスラッシュ(\)文字はこの文脈ではエスケープ文字ではあり ません。特殊文字にマッチさせるには、その文字を角括弧で囲みます(例:[?]
)。
実装の詳細については、以下を参照されたい:
- ウィキペディアの Glob の記事
man 7 glob
デフォルトでは、返される正規表現は完全に固定されています。つまり、anchoredPattern() を再度呼び出す必要はありません。アンカーされていない正規表現を得るには、options にUnanchoredWildcardConversion を渡します。
escape()も参照してください 。
[static]
QString QRegularExpression::wildcardToRegularExpression(const QString &pattern, QRegularExpression::WildcardConversionOptions options = DefaultWildcardConversion)
これはオーバーロードされた関数です。
[noexcept]
QRegularExpression &QRegularExpression::operator=(QRegularExpression &&re)
Move-正規表現re をこのオブジェクトに代入し、その結果への参照を返します。パターンとパターンオプションの両方がコピーされます。
移動されたQRegularExpression は、破棄するか代入することしかできないことに注意してください。デストラクタや代入演算子以外の関数を呼び出した場合の効果は未定義です。
[noexcept]
QRegularExpression &QRegularExpression::operator=(const QRegularExpression &re)
このオブジェクトに正規表現re を代入し、そのコピーへの参照を返します。パターンとパターンオプションの両方がコピーされます。
関連する非メンバー
[noexcept]
size_t qHash(const QRegularExpression &key, size_t seed = 0)
key のハッシュ値を返します。計算のシードとしてseed を使用します。
[noexcept]
bool operator!=(const QRegularExpression &lhs, const QRegularExpression &rhs)
lhs の正規表現がrhs の正規表現と異なる場合はtrue
を返し、そうでない場合は false を返します。
operator==()も参照 。
QDataStream &operator<<(QDataStream &out, const QRegularExpression &re)
正規表現re をストリームout に書き込みます。
Qt データ型のシリアライズ」も参照して ください。
QDebug operator<<(QDebug debug, QRegularExpression::PatternOptions patternOptions)
デバッグのために、パターン・オプションpatternOptions をデバッグ・オブジェクトdebug に書き込みます。
デバッグテクニック」も参照して ください。
QDebug operator<<(QDebug debug, const QRegularExpression &re)
デバッグのために、正規表現re をデバッグオブジェクトdebug に書き込みます。
デバッグ技法も参照の こと。
[noexcept]
bool operator==(const QRegularExpression &lhs, const QRegularExpression &rhs)
lhs の正規表現とrhs の正規表現が等しい場合はtrue
を返し、等しくない場合は false を返します。2つのQRegularExpression オブジェクトは、同じパターン文字列と同じパターンオプションを持つ場合、等しくなります。
operator!=()も参照 。
QDataStream &operator>>(QDataStream &in, QRegularExpression &re)
ストリームin から正規表現をre に読み込みます。
Qt データ型のシリアライズ」も参照して ください。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。