このページでは

QRegularExpression Class

QRegularExpression クラスは、正規表現を用いたパターンマッチング機能を提供します。詳細...

ヘッダー: #include <QRegularExpression>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注:このクラスのすべての関数は再入可能です。

QRegularExpression の比較

カテゴリ比較可能な型
等価性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)

詳細説明

正規表現(regexp)は、文字列やテキストを扱うための非常に強力なツールです。これは、例えば次のような多くの場面で役立ちます。

妥当性チェック正規表現を使用すると、部分文字列が特定の条件(整数であるか、空白を含まないかなど)を満たしているかどうかを検証できます。
検索正規表現は、単純な部分文字列の一致比較よりも強力なパターンマッチングを提供します。例えば、「mail」「letter」「correspondence」のいずれかの単語に一致し、「email」「mailman」「mailer」「letterbox」などの単語には一致しないように指定できます。
検索と置換正規表現を使用すると、部分文字列のすべての出現箇所を別の部分文字列に置換することができます。例えば、「 & 」がすでに「&amp;」に続いていない箇所を除き、「&」のすべての出現箇所を「 &amp; 」に置換することができます。
文字列の分割正規表現を使用すると、文字列をどこで分割すべきかを特定できます。例えば、タブ区切りの文字列を分割する場合などです。

この文書は、正規表現を用いたパターンマッチングに関する完全なリファレンスというわけではありません。また、以下の部分を読むには、Perl風の正規表現とそのパターン構文に関する基本的な知識が必要です。

正規表現に関する優れた参考資料としては、以下が挙げられます:

はじめに

QRegularExpression は、Perl 互換の正規表現を実装しています。Unicode を完全にサポートしています。QRegularExpression がサポートする正規表現の構文の概要については、前述の pcrepattern(3) マニュアルページを参照してください。 正規表現は、パターン文字列と、そのパターン文字列の意味を変更する一連のパターンオプションという 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 列挙型のドキュメントを参照してください。

マッチタイプとマッチオプション

match() およびglobalMatch() 関数の最後の 2 つの引数により、マッチタイプとマッチオプションが設定されます。 マッチタイプは、QRegularExpression::MatchType 列挙型の値です。「従来の」マッチングアルゴリズムは、NormalMatch マッチタイプ(デフォルト)を使用することで選択されます。また、対象文字列に対する正規表現の部分一致を有効にすることも可能です。詳細については、「partial matching 」のセクションを参照してください。

マッチオプションは、1つ以上のQRegularExpression::MatchOption 値のセットです。これらは、対象文字列に対する正規表現の特定の一致処理の方法を変更します。詳細については、QRegularExpression::MatchOption 列挙型のドキュメントを参照してください。

通常のマッチング

マッチングを実行するには、マッチング対象の文字列を引数として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() 関数の引数としてオフセットを指定することで、対象文字列内の任意のオフセット位置からマッチを開始することも可能です。次の例では、マッチがオフセット 1 から開始されるため、"12 abc" は一致しません:

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つ結果が残っている場合にtrueを返し、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)) {
    // ...
}

globalMatch() 関数には、match() による通常の一致処理とまったく同じように、開始オフセットと 1 つ以上のマッチングオプションを渡すことができます。

部分一致

部分一致とは、対象文字列の末尾に到達したものの、一致を完了させるためにさらに文字が必要な状態を指します。なお、部分一致では一致アルゴリズムの多くの最適化を適用できないため、通常の一致に比べてはるかに非効率的であることに注意してください。

部分一致を行うには、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 列挙型を参照してください)。

特に、最後のケースでは、正規表現エンジンに部分一致を報告させたいと考えています。つまり、対象文字列に対してパターンの一致は成功しているものの、対象文字列の末尾に到達したため、それ以上の一致処理を続けることができない状態です。 ただし、マッチングアルゴリズムは継続してすべての可能性を試すべきであり、完全な(部分的なものではない)一致が見つかった場合は、それを報告し、入力文字列を完全に有効なものとして受け入れるべきであることに注意してください。

この挙動は、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

別のパターンを用いたもう1つの例で、部分一致よりも完全一致を優先する動作を示します:

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

これは、選択演算子の最初の分岐をマッチングする際に部分一致が見つかり、そのため 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

この挙動は、エンジンが対象文字列を、一致を検索対象とするテキスト全体の単なる部分文字列であると想定していることを思い出せば、容易に理解できます(つまり、前述したように、エンジンは対象文字列の末尾の先に他の文字が存在すると想定しているのです)。

* という量指定子は貪欲(greedy)であるため、完全一致として報告することはエラーとなる可能性があります。なぜなら、現在の対象文字列"abc" の後に、"abc" という他の出現箇所が存在する可能性があるからです。 例えば、完全なテキストが「abcabcX」であった場合、(完全なテキストにおいて)報告すべき正しい一致は「"abcabc" 」となります。しかし、先頭の「"abc" 」のみに一致させた結果、部分一致として報告されてしまいます。

エラー処理

パターン文字列の構文エラーにより、QRegularExpressionオブジェクトが無効になる可能性があります。isValid()関数は、正規表現が有効な場合はtrueを、そうでない場合はfalseを返します:

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 ` をそれぞれ 0 以外の値または 0 に設定することで、デフォルト設定を上書きし、JIT の使用を有効または無効にすることができます(デバッグモードおよびリリースモードの両方で可能です)。

QRegularExpressionMatch およびQRegularExpressionMatchIteratorも参照してください 。

メンバ型のドキュメント

enum QRegularExpression::MatchOption
flags QRegularExpression::MatchOptions

定数値説明
QRegularExpression::NoMatchOption0x0000一致オプションは設定されていません。
QRegularExpression::AnchoredMatchOptionAnchorAtOffsetMatchOption代わりに AnchorAtOffsetMatchOption を使用してください。
QRegularExpression::AnchorAtOffsetMatchOption0x0001パターン文字列に、その位置にマッチを固定するメタ文字が含まれていない場合でも、マッチを成功させるためには、match() に渡されたオフセットの位置から正確に開始する必要があります。 このオプションを指定しても、一致の終了位置が対象文字列の末尾に固定されるわけではないことに注意してください。正規表現を完全に固定したい場合は、anchoredPattern() を使用してください。この列挙型値は Qt 6.0 で導入されました。
QRegularExpression::DontCheckSubjectStringMatchOption0x0002マッチを試行する前に、対象文字列のUTF-16の有効性はチェックされません。無効な文字列のマッチを試みると、プログラムがクラッシュしたり、セキュリティ上の問題を引き起こしたりする可能性があるため、このオプションの使用には細心の注意を払ってください。この列挙型値はQt 5.4で導入されました。

MatchOptions 型は、QFlags<MatchOption> の typedef です。これは、MatchOption 値の OR 組み合わせを格納します。

enum QRegularExpression::MatchType

MatchType 列挙型は、対象の文字列に対して実行すべき照合の種類を定義します。

定数値説明
QRegularExpression::NormalMatch0通常の一致処理が行われます。
QRegularExpression::PartialPreferCompleteMatch1パターン文字列は、対象文字列に対して部分的に照合されます。部分一致が見つかった場合は、それが記録され、通常どおり他の照合候補が試されます。 その後、完全一致が見つかった場合は、部分一致よりも優先され、この場合は完全一致のみが報告されます。一方、完全一致が見つからず(部分一致のみが見つかった場合)、部分一致が報告されます。
QRegularExpression::PartialPreferFirstMatch2パターン文字列は、対象文字列に対して部分的に照合されます。部分一致が見つかった場合、照合は停止し、その部分一致が報告されます。この場合、他の照合候補(完全一致につながる可能性のあるものも含む)は試されません。 さらに、このマッチングタイプは、対象文字列がより大きなテキストの一部に過ぎず、(そのテキスト内において)対象文字列の末尾の先にも他の文字が存在することを前提としています。これにより予期せぬ結果が生じる可能性があります。詳細については、「partial matching 」セクションの解説を参照してください。
QRegularExpression::NoMatch3一致処理は行われません。この値は、デフォルトで構築された `QRegularExpressionMatch ` または `QRegularExpressionMatchIterator` によって一致タイプとして返されます。一致処理が一切行われないため、この一致タイプをユーザーにとってあまり有用ではありません。この列挙値は Qt 5.1 で導入されました。

enum QRegularExpression::PatternOption
flags QRegularExpression::PatternOptions

PatternOption 列挙型は、パターン文字列の解釈方法、ひいてはパターンが対象文字列と照合される方法を指定する修飾子を定義しています。

定数定数名説明
QRegularExpression::NoPatternOption0x0000パターンオプションは設定されていません。
QRegularExpression::CaseInsensitiveOption0x0001パターンは大文字と小文字を区別せずに、対象文字列と照合されます。このオプションは、Perl の正規表現における /i 修飾子に対応します。
QRegularExpression::DotMatchesEverythingOption0x0002パターン文字列内のドットメタ文字 (.) は、改行を含め、対象文字列内の任意の文字と一致させることができます(通常、ドットは改行と一致しません)。このオプションは、Perl の正規表現における/s 修飾子に対応します。
QRegularExpression::MultilineOption0x0004パターン文字列内のキャレット(^ )およびドル記号($ )メタ文字は、対象文字列内の改行の直後および直前にそれぞれ一致するほか、対象文字列の先頭および末尾でも一致することが許可されます。このオプションは、Perl の正規表現における/m 修飾子に対応します。
QRegularExpression::ExtendedPatternSyntaxOption0x0008パターン文字列内の、エスケープされておらず、かつ文字クラス外にある空白はすべて無視されます。さらに、文字クラス外にあるエスケープされていないシャープ記号 (#) は、その直後に続くすべての文字を、最初の改行(これを含む)まで無視させます。 これは、パターン文字列の可読性を高めるだけでなく、正規表現内にコメントを挿入するためにも使用できます。これは、パターン文字列がファイルから読み込まれる場合やユーザーによって記述される場合に特に有用です。なぜなら、C++コードでは、文字列リテラルの規則を利用して、パターン文字列の外側にコメントを記述することが常に可能だからです。 このオプションは、Perl の正規表現における `/x ` 修飾子に対応しています。
QRegularExpression::InvertedGreedinessOption0x0010量指定子の貪欲性が反転します。つまり、* 、+ 、? 、{m,n} などは遅延型になり、それらの遅延型バージョン(*? 、+? 、?? 、{m,n}? など)は貪欲型になります。Perl の正規表現には、このオプションに相当するものはありません。
QRegularExpression::DontCaptureOption0x0020名前なしのキャプチャグループは部分文字列をキャプチャしませんが、名前付きキャプチャグループは意図したとおりに動作し、一致全体に対応する暗黙のキャプチャグループ番号 0 も同様に動作します。Perl の正規表現には、このオプションに相当するものは存在しません。
QRegularExpression::UseUnicodePropertiesOption0x0040\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::DefaultWildcardConversion0x0変換オプションは設定されません。
QRegularExpression::UnanchoredWildcardConversion0x1変換時にパターンがアンカーされません。これにより、ワイルドカード式の部分文字列一致が可能になります。
QRegularExpression::NonPathWildcardConversion (since Qt 6.6)0x2この変換では、パターンをファイルパスのグロブとして解釈しません。

この列挙型は Qt 6.0 で導入されました。

WildcardConversionOptions 型は、QFlags<WildcardConversionOption> の typedef です。これは、WildcardConversionOption 値の OR 結合を格納します。

QRegularExpression::wildcardToRegularExpressionも参照してください 。

メンバ関数のドキュメント

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=()も参照してください 。

[constexpr noexcept default, 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);

NUL注:この関数はPer lのquotemetaアルゴリズムを実装しており、str 内のすべての文字に対してバックスラッシュでエスケープ処理を行います。ただし、[A-Z] 、[a-z] 、[0-9] の範囲にある文字、およびアンダースコア(_ )文字は除きます。 Perlとの唯一の違いは、str 内のリテラルNULが、"\\\0" (バックスラッシュ +'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 文字列に対して、対象文字列内のoffset の位置から開始し、matchType タイプのマッチングを使用し、指定されたmatchOptions を順守して、正規表現のグローバルマッチを実行しようとします。

返される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 文字列ビューに対して、対象文字列内のoffset の位置から開始し、matchType 型のマッチングを使用し、指定されたmatchOptions を尊重して、正規表現のグローバルマッチングを実行しようとします。

返される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 文字列に対して、対象文字列内のoffset の位置から開始し、matchType 型のマッチを使用し、指定されたmatchOptions を適用して、正規表現のマッチングを試みます。

返される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 文字列ビューに対して、対象文字列内のoffset の位置から開始し、matchType タイプのマッチングを使用し、指定されたmatchOptions を尊重して、正規表現のマッチングを試みます。

返される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 種類の変換が可能です。1 つはファイルパスのグロブを対象としたもので、もう 1 つはより汎用的なものです。

デフォルトでは、変換はファイルパスのグロブを対象としており、特にパス区切り文字には特別な処理が適用されます。これは、単に「*」を「.*」などに置き換えるだけの基本的な変換ではないことを意味します。

QString wildcard = QRegularExpression::wildcardToRegularExpression("*.jpeg");
// Will match files with names like:
//    foo.jpeg
//    f_o_o.jpeg
//    föö.jpeg

より汎用的なグロブ変換は、変換関数 `options` に `NonPathWildcardConversion ` を渡すことで利用可能です。

この実装は、グロブパターンのワイルドカードの定義に厳密に従っています:

c以下で言及する文字を除き、任意の文字はそれ自体を表します。したがって、c は文字c に一致します。
?パス区切り文字(ファイルパスのグロブ処理が選択されている場合)を除き、任意の単一文字に一致します。これは、完全な正規表現における `b{.}` と同じです。
*パス区切り文字(ファイルパスのグロブ検索が選択されている場合)を除く、任意の文字を0回以上一致させます。これは、完全な正規表現における.*と同じです。
[abc]括弧内に指定された文字のいずれか1文字に一致します。
[a-c]角括弧内に指定された文字を1つ一致させます。角括弧で指定された範囲内の1文字に一致します。
[!abc]括弧内に指定されていない文字を1文字一致させます。これは、完全な正規表現での[^abc]と同じです。
[!a-c]角括弧で指定された範囲に含まれない1文字に一致します。これは、完全な正規表現における[^a-c]と同じです。

注: 歴史的な理由により 、この文脈ではバックスラッシュ (\) 文字はエスケープ文字として機能しません。特殊文字のいずれかと一致させるには、その文字を角括弧で囲んでください(例:[?] )。

実装に関する詳細情報は、以下を参照してください:

デフォルトでは、返される正規表現は完全にアンカー付きです。つまり、結果に対してanchoredPattern()を再度呼び出す必要はありません。アンカーなしの正規表現を取得するには、変換関数options にUnanchoredWildcardConversion を引数として渡してください。

escape()も参照してください 。

[static] QString QRegularExpression::wildcardToRegularExpression(const QString &pattern, QRegularExpression::WildcardConversionOptions options = DefaultWildcardConversion)

これはオーバーロードされた関数です。

[noexcept] QRegularExpression &QRegularExpression::operator=(QRegularExpression &&re)

正規表現 `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 データ型のシリアライズ」も参照してください 。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.