QRegExp Class
QRegExp クラスは、正規表現を用いたパターンマッチング機能を提供します。詳細...
| ヘッダー: | #include <QRegExp> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core5Compat) target_link_libraries(mytarget PRIVATE Qt6::Core5Compat) |
| qmake: | QT += core5compat |
- 継承されたメンバーを含む、すべてのメンバーの一覧
- QRegExpは、暗黙的に共有されるクラスの一部です。
注:このクラスのすべての関数は再入可能です。
パブリック型
| enum | CaretMode { CaretAtZero, CaretAtOffset, CaretWontMatch } |
| enum | PatternSyntax { RegExp, RegExp2, Wildcard, WildcardUnix, FixedString, W3CXmlSchema11 } |
パブリック関数
| QRegExp() | |
| QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, QRegExp::PatternSyntax syntax = RegExp) | |
| QRegExp(const QRegExp &rx) | |
| ~QRegExp() | |
| QString | cap(int nth = 0) const |
| int | captureCount() const |
| QStringList | capturedTexts() const |
| Qt::CaseSensitivity | caseSensitivity() const |
| int | countIn(const QString &str) const |
| QString | errorString() const |
| bool | exactMatch(const QString &str) const |
| QStringList | filterList(const QStringList &stringList) const |
| int | indexIn(const QStringList &list, int from) const |
| int | indexIn(const QString &str, int offset = 0, QRegExp::CaretMode caretMode = CaretAtZero) const |
| bool | isEmpty() const |
| bool | isMinimal() const |
| bool | isValid() const |
| int | lastIndexIn(const QStringList &list, int from) const |
| int | lastIndexIn(const QString &str, int offset = -1, QRegExp::CaretMode caretMode = CaretAtZero) const |
| int | matchedLength() const |
| QString | pattern() const |
| QRegExp::PatternSyntax | patternSyntax() const |
| int | pos(int nth = 0) const |
| QString | removeIn(const QString &str) const |
| QString | replaceIn(const QString &str, const QString &after) const |
| QStringList | replaceIn(const QStringList &stringList, const QString &after) const |
| void | setCaseSensitivity(Qt::CaseSensitivity cs) |
| void | setMinimal(bool minimal) |
| void | setPattern(const QString &pattern) |
| void | setPatternSyntax(QRegExp::PatternSyntax syntax) |
| QStringList | splitString(const QString &str, Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const |
| void | swap(QRegExp &other) |
| operator QVariant() const | |
| bool | operator!=(const QRegExp &rx) const |
| QRegExp & | operator=(QRegExp &&other) |
| QRegExp & | operator=(const QRegExp &rx) |
| bool | operator==(const QRegExp &rx) const |
静的パブリックメンバー
| QString | escape(const QString &str) |
関連する非メンバー
| size_t | qHash(const QRegExp &key, size_t seed = 0) |
| QDataStream & | operator<<(QDataStream &out, const QRegExp ®Exp) |
| QDataStream & | operator>>(QDataStream &in, QRegExp ®Exp) |
詳細説明
このクラスはQt 6で非推奨となりました。新しいコードを作成する際は、代わりにQRegularExpression を使用してください。QRegExpからQRegularExpression への古いコードの移植に関するガイドラインについては、Porting to QRegularExpression を参照してください。
正規表現("regexp")とは、テキスト内の部分文字列を照合するためのパターンです。これは、次のような多くの場面で役立ちます。例えば、
| 検証 | 正規表現を使用すると、部分文字列が特定の条件(整数であるか、空白を含まないかなど)を満たしているかどうかを検証できます。 |
| 検索 | 正規表現は、単純な部分文字列の一致検索よりも強力なパターンマッチングを提供します。例えば、「mail」「letter」「correspondence」のいずれかの単語に一致し、「email」「mailman」「mailer」「letterbox」などの単語には一致しないように指定できます。 |
| 検索と置換 | 正規表現を使用すると、部分文字列のすべての出現箇所を別の部分文字列に置換することができます。例えば、「 & 」がすでに「&」に続いている場合を除き、すべての「&」を「&」に置換することができます。 |
| 文字列の分割 | 正規表現を使用すると、文字列をどこで分割すべきかを特定できます。例えば、タブ区切りの文字列を分割する場合などです。 |
正規表現の簡単な紹介、Qtの正規表現言語の説明、いくつかの例、および関数のドキュメント自体が掲載されています。 QRegExp は、Perl の正規表現言語をモデルにしています。Unicode を完全にサポートしています。QRegExp は、コマンドシェルに見られる機能に似た、より単純なワイルドカードモードでも使用できます。 QRegExpで使用される構文規則は、setPatternSyntax() を使用して変更できます。特に、パターンの構文をQRegExp::FixedString に設定することができます。これは、一致させるパターンがプレーンな文字列として解釈されることを意味します。つまり、特殊文字(バックスラッシュなど)はエスケープされません。
正規表現に関する優れた参考書として、Jeffrey E. F. Friedl著『Mastering Regular Expressions(第3版)』(ISBN 0-596-52812-4)があります。
注: Qt5では 、新しいQRegularExpression クラスがPerl互換の正規表現実装を提供しており、QRegExpの代わりにこれを使用することが推奨されます。
セキュリティ上の考慮事項
QRegExp は、パターンが消費するリソースに制限を設けておらず、その内部バッファのサイズがオーバーフローする可能性があります。 そのため、比較的小さな細工されたパターンでも、利用可能なメモリを使い果たしたり、スタックをオーバーフローさせたり、メモリを破損させたりする可能性があります。これは、パターンがコンパイルされている間、つまりパターンが割り当てられた直後に発生し、テキストが一致する必要はありません。内部で正規表現に変換されるwildcard パターンについても同様です。
QRegExpは、信頼できるソースからのパターンのみに使用してください。代わりに、QRegularExpression の使用を推奨します。 では、マッチ処理が消費するリソースに制限が設けられています。
はじめに
正規表現は、式、量指定子、およびアサーションから構成されます。最も単純な式は文字であり、例えばxや5 などです。式は、角括弧で囲まれた文字の集合である場合もあります。[ABCD] は、A、B、C、Dのいずれかに一致します。この同じ式は[A-D] と書くこともでき、英字の大文字のいずれかに一致する式は[A-Z] と記述されます。
量指定子は、一致させる必要がある式の出現回数を指定します。x{1,1}は、x が 1 つだけ一致することを意味します。x{1,5}は、x が少なくとも 1 つ、かつ 5 つ以下含まれるxの文字列に一致することを意味します。
一般的に、正規表現では括弧やタグのバランスをチェックすることはできない点に注意してください。 たとえば、<b> タグがネストされていない場合、開始タグ `html<b> ` と終了タグ `</b>` に一致する正規表現を書くことはできますが、<b> タグがネストされている場合、その同じ正規表現は、開始タグ `<b> ` に誤った終了タグ `</b>` を一致させてしまいます。断片 `<b>bold <b>bolder</b></b>` については、最初の `<b> ` が最初の `</b>` と一致してしまいますが、これは正しくありません。 ただし、ネストされた括弧やタグを正しく一致させる正規表現を作成することは可能です。ただし、それはネストのレベル数が固定されており、かつ既知の場合に限られます。ネストのレベル数が固定されておらず、かつ既知でない場合、失敗しない正規表現を作成することは不可能です。
0 から 99 までの整数に一致する正規表現を作成するとします。少なくとも 1 桁が必要であるため、まず[0-9]{1,1} という式から始めます。これは 1 桁の数字に正確に 1 回一致します。この正規表現は 0 から 9 までの整数に一致します。 99までの整数に一致させるには、最大出現回数を2に増やし、正規表現を[0-9]{1,2}とします。この正規表現は、0から99までの整数に一致するという当初の要件を満たしますが、文字列の途中に現れる整数にも一致してしまいます。 一致する整数を文字列全体にしたい場合は、アンカーアサーションである^(キャレット)と$(ドル記号)を使用する必要があります。^ が正規表現の最初の文字である場合、その正規表現は文字列の先頭から一致しなければならないことを意味します。$ が正規表現の最後の文字である場合、その正規表現は文字列の末尾まで一致しなければならないことを意味します。これにより、正規表現は^[0-9]{1,2}$ となります。なお、^や$ といったアンカーは、文字そのものではなく、文字列内の位置に一致する点に注意してください。
他の場所で正規表現の記述を見たことがある場合、ここで示したものとは異なって見えるかもしれません。これは、一部の文字セットや量指定子が非常に一般的であるため、それらを表す特別な記号が割り当てられているからです。[0-9]は記号 \dで置き換えることができます。正確に 1 回だけ一致させる量指定子{1,1} は、式そのもので置き換えることができます。つまり、x{1,1}はx と同じ意味になります。したがって、0 から 99 までを一致させる式は、^\d{1,2}$ と記述できます。 また、^\d\d {0,1}$ と書くこともできます。つまり、文字列の先頭から数字を1つマッチさせ、その直後に0または1個の数字が続くものをマッチさせます。実際には、^\d\d ?$ と記述されます。 「?」は量指定子{0,1}(つまり、0回または1回の出現)の省略形です。「?」は式をオプションにします。正規表現^\d\d ?$ は 、「文字列の先頭から、1桁の数字に一致し、その直後に0個または1個の数字が続き、さらにその直後に文字列の末尾が来る」ことを意味します。
「mail」、「letter」、「correspondence」のいずれかの単語に一致するが、これらの単語を含む単語(例:'email'、'mailman'、'mailer'、'letterbox')には一致しない正規表現を作成するには、まず「mail」に一致する正規表現から始めます。 完全に記述すると、この正規表現はm{1,1}a{1,1}i{1,1}l{1,1} となりますが、文字式は自動的に{1,1} で定量化されるため、 正規表現を「mail」、つまり「m」に続いて「a」、その後に「i」、さらに「l」が続く形に簡略化できます。 ここで、'または'を意味する縦棒| を使用して、他の 2 つの単語を含めることができます。したがって、これら 3 つの単語のいずれかに一致する正規表現はmail|letter|correspondence となります。「mail」、「letter」、または「correspondence」に一致します。 この正規表現は、一致させたい3つの単語のいずれかと一致しますが、同時に「email」など、一致させたくない単語とも一致してしまいます。不要な単語との一致を防ぐには、単語の境界で一致を開始・終了するように指定する必要があります。 まず、正規表現を括弧で囲みます:(mail|letter|correspondence)。括弧は式をグループ化し、正規表現のどの部分をcapture したいかを特定します。式を括弧で囲むことで、より複雑な正規表現の構成要素として使用できるようになります。 また、3つの単語のうち実際にどの単語が一致したかを確認することも可能になります。一致を単語の境界で開始・終了させるには、正規表現を \b単語境界アサーションで囲みます:\b(mail|letter|correspondence)\b 。これで、この正規表現は「単語境界に一致し、その後に括弧で囲まれた正規表現が続き、さらに単語境界が続く」ことを意味します。 \b アサーションは、文字ではなく、正規表現内の位置に一致します。単語境界とは、スペース、改行、または文字列の先頭や末尾など、単語を構成しない任意の文字のことです。
アンパサンド文字を HTML エンティティ& に置換したい場合、一致させる正規表現は単に& となります。しかし、この正規表現では、すでに HTML エンティティに変換されているアンパサンドにも一致してしまいます。「amp;」が直後に続いていないアンパサンドのみを置換したいとします。そのためには、否定先行確認アサーション(?!__) が必要です。これにより、正規表現は&(?!amp;) と記述できます。つまり、「amp;」 が直後に続いていない アンパサンド に 一致させるということです。
文字列内の「Eric」と「Eirik」の出現回数をすべて数えたい場合、有効な解決策として、\b (Eric|Eirik)\bおよび\bEi?ri[ck]\b が挙げられます。いずれかの名前を含む単語(例:「Ericsson」)との一致を避けるためには、単語境界アサーション「\b 」が必要です。 なお、2番目の正規表現は、「Eric」、「Erik」、「Eiric」、「Eirik」など、意図したよりも多くの綴りに一致してしまうことに注意してください。
上記で説明した例の一部は、「code examples 」セクションで実装されています。
文字および文字セットの略語
| 要素 | 意味 |
|---|---|
| c | 文字は、正規表現において特別な意味を持たない限り、それ自体を表します。例:cは文字c に一致します。 |
| \c | バックスラッシュの後に続く文字は、以下で指定する場合を除き、その文字自体と一致します。例:文字列の先頭にあるリテラルなキャレットと一致させるには、\^ と記述します。 |
| \a | ASCII ベル (BEL, 0x07) に一致します。 |
| \f | ASCII フォームフィード (FF, 0x0C) に一致します。 |
| \n | ASCII ラインフィード (LF、0x0A、Unix 改行) に一致します。 |
| \r | ASCII のキャリッジリターン (CR、0x0D) に一致します。 |
| \t | ASCII 水平タブ (HT, 0x09) に一致します。 |
| \v | ASCII 垂直タブ (VT、0x0B) に一致します。 |
| \xhhhh | 16 進数hhhh(0x0000 から 0xFFFF の範囲)に対応する Unicode 文字に一致します。 |
| \0ooo(つまり、\zero ooo) | は、8進数ooo(0 から 0377 まで)に対応する ASCII/Latin1 文字に一致します。 |
| . (ドット) | 任意の文字(改行を含む)に一致します。 |
| \d | 数字(QChar::isDigit()) と一致します。 |
| \D | 数字以外の文字に一致します。 |
| \s | 空白文字と一致します (QChar::isSpace())。 |
| \S | 空白以外の文字に一致します。 |
| \w | 単語文字(QChar::isLetterOrNumber()、QChar::isMark()、または '_')に一致します。 |
| \W | 単語以外の文字に一致します。 |
| \n | n 番目のバックリファレンス。例:\1 、\2 など。 |
注:C++ コンパイラは、文字列内のバックスラッシュを変換します。正規表現に\を含めるには、それを 2 回入力します(例:\\ )。バックスラッシュ文字そのものを一致させるには、それを 4 回入力します(例:\\\\ )。
文字の集合
角括弧は、その中に含まれる任意の文字に一致することを意味します。前述の文字セットの省略形は、角括弧で囲まれた文字セットの中に含めることができます。文字セットの省略形と、以下の2つの例外を除き、角括弧内の文字には特別な意味はありません。
| ^ | キャレット記号は、文字列の先頭(つまり、角括弧の直後)に現れた場合、その文字列を否定します。[abc]は 'a'、'b'、または 'c' に一致しますが、[^abc]は 'a'、'b'、または 'c'以外の任意の文字に一致します。 |
| - | ダッシュは文字の範囲を示します。[W-Z]は 'W'、'X'、'Y'、または 'Z' に一致しますが、[^W-Z] は 'W'、'X'、'Y'、または 'Z' 以外の任意の文字に一致します。- |
プラットフォームや言語をまたいで文字範囲を使用するよりも、定義済みの文字セットの省略形を使用するほうが移植性が高くなります。たとえば、[0-9] は西欧アルファベットの数字に一致しますが、 \dあらゆる文字体系の数字に一致します。
注:他の正規表現のドキュメントでは、文字の集合はしばしば「文字クラス」と呼ばれます。
量指定子
デフォルトでは、式は自動的に{1,1} で定量化されます。つまり、その式は正確に 1 回出現する必要があります。以下のリストにおいて、Eは式を表します。式とは、文字、文字の集合を表す省略形、角括弧で囲まれた文字の集合、または括弧で囲まれた式のことです。
| E? | Eが0回または1回出現することに一致します。この量指定子は、「前の式は省略可能である」という意味を持ちます。なぜなら、その式が見つかるかどうかに関係なく一致するからです。E? はE{0,1}と同じです。例えば、dents?は「dent」または「dents」に一致します。 |
| E+ | Eが1回以上出現するパターンに一致します。E+はE{1,}と同じ意味です。例:0+は「0」、「00」、「000」などに一致します。 |
| E* | Eが0回以上出現する文字列に一致します。これはE{0,}と同じです。*という量指定子は、本来+を使うべき場面で誤って使用されることがよくあります。 例えば、\s*$という式を、末尾が空白で終わる文字列に一致させるために使用した場合、\s*$は 「0個以上の空白文字と、その後に続く文字列の末尾」に一致することを意味するため、すべての文字列に一致してしまいます。末尾に少なくとも1つの空白文字がある文字列に一致させる正しい正規表現は、\s+$です。 |
| E{n} | Eが 正確にn回出現する文字列に一致します。E{n}は、E をn回繰り返すことと同じです。たとえば、x{5} はxxxxxと同じです。また、E{n,n}(例:x{5,5})と同じでもあります。 |
| E{n,} | Eが少なくともn回出現する部分文字列に一致します。 |
| E{,m} | Eが 最大m回出現するパターンに一致します。E{,m} はE{0,m}と同じです。 |
| E{n,m} | Eが少なくともn 回、かつ最大m回出現する部分列に一致します。 |
量指定子を直前の文字以外にも適用するには、括弧を使って式内の文字をグループ化します。たとえば、tag+は 't' の後に 'a'、さらにその後に少なくとも 1 つの 'g' が続くパターンに一致しますが、(tag)+は 'tag' が少なくとも 1 回出現するパターンに一致します。
注:量指定子は通常「貪欲」です。常に可能な限り多くのテキストに一致します。例えば、0+は最初に見つかったゼロと、その後に続くすべてのゼロに一致します。「20005」に適用すると、「20005」に一致します。 量指定子を非貪欲にすることも可能です。詳細はsetMinimal() を参照してください。
テキストのキャプチャ
括弧を使用すると、要素をグループ化して、それらに量指定を行ったりキャプチャしたりすることができます。例えば、文字列に一致する正規表現「mail|letter|correspondence」がある場合、これらの単語のいずれかが一致したことは分かりますが、具体的にどれが一致したかは分かりません。 括弧を使用すると、その範囲内で一致した内容を「キャプチャ」することができます。したがって、(mail|letter|correspondence)を使用し、この正規表現を文字列「I sent you some email」に照合した場合、cap() またはcapturedTexts() 関数を使用して、一致した文字(この場合は 'mail')を抽出することができます。
キャプチャされたテキストは、正規表現自体の中で使用することができます。キャプチャされたテキストを参照するには、cap() と同様に、1 からインデックス付けされたバックリファレンスを使用します。 たとえば、\bを使用して、文字列内の重複する単語を検索することができます。\w+、\W+、\1 、\b 。これは、単語の境界に続き、1つ以上の単語文字、さらに1つ以上の非単語文字、そして最初の括弧で囲まれた式と同じテキスト、最後に単語の境界が続くというパターンを一致させることを意味します。
括弧をキャプチャではなく、純粋にグループ化のために使用したい場合は、非キャプチャ構文を使用できます。例:(?:green|blue)。非キャプチャ括弧は「(?:」で始まり、「)」で終わります。 この例では、「green」または「blue」のいずれかに一致しますが、一致内容をキャプチャしないため、一致したかどうかのみがわかり、実際にどの色が検出されたかはわかりません。キャプチャしない括弧を使用すると、正規表現エンジンが処理すべき管理作業が少なくなるため、キャプチャする括弧を使用するよりも効率的です。
キャプチャする括弧もキャプチャしない括弧も、ネストさせることができます。
歴史的な理由により、キャプチャ括弧に適用される量指定子(例:*)は、他の量指定子よりも「貪欲」に動作します。 たとえば、a*(a*) は「aaa」に一致し、cap(1) == "aaa" となります。この挙動は、他の正規表現エンジン(特に Perl)の挙動とは異なります。より直感的なキャプチャ挙動を得るには、QRegExp コンストラクタにQRegExp::RegExp2 を指定するか、setPatternSyntax (QRegExp::RegExp2 )を呼び出してください。
一致する数が事前に決定できない場合、ループ内で `cap()` を使用するのが一般的な手法です。例:
QRegExp rx("(\\d+)");
QString str = "Offsets: 12 14 99 231 7";
QStringList list;
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
list << rx.cap(1);
pos += rx.matchedLength();
}
// list: ["12", "14", "99", "231", "7"]主張
アサーションは、正規表現内の出現位置におけるテキストについて何らかの断言を行うものですが、特定の文字と一致するわけではありません。以下のリストにおいて、Eは任意の式を表します。
| ^ | キャレットは文字列の先頭を表します。リテラル「^ 」に一致させたい場合は、\\^ と記述してエスケープする必要があります。例えば、^#includeは「#include」という文字で始まる文字列にのみ一致します。(キャレットが文字セットの最初の文字である場合、特別な意味を持ちます。詳細はSets of Characters を参照してください。) |
| $ | ドル記号は文字列の終端を表します。たとえば、\d\s *$ は、数字で終わり、その後に任意で空白が続く文字列に一致します。リテラル$ に一致させたい場合は、\\$ と記述してエスケープする必要があります。 |
| \b | 単語の境界。例えば、正規表現 \bOK\b は、単語境界(例:文字列の先頭や空白)の直後に文字 'O' があり、その直後に文字 'K' があり、さらにその直後に別の単語境界(例:文字列の末尾や空白)があるというパターンに一致することを意味します。 ただし、このアサーションは実際には空白文字には一致しないため、(\bOK\b) と記述して一致があった場合、文字列が "It'sOKnow" であっても、一致する部分には 'OK' しか含まれません。 |
| \B | 単語境界以外。このアサーションは、 \b が偽となる場所であればどこでも真となります。例えば、 \Bon\B "Left on"内で検索した場合、一致は失敗します(スペースと文字列の末尾は非単語境界ではありません)。しかし、「tonne」内では一致します。 |
| (?=E) | 正の先読み。このアサーションは、正規表現のこの位置で式が一致する場合に真となります。たとえば、const(?=\s+char)は、「staticconstchar *」のように、その後に「char」が続く「const」に常に一致します。(「staticconst char*」に一致するconst\s+char と比較してください。) |
| (?!E) | 負の先行確認。このアサーションは、正規表現のこの位置で式が一致しない場合に真となります。例えば、const(?!\s+char)は、'const' の後に 'char' が続く場合を除き、'const' に一致します。 |
ワイルドカードによるマッチング
bashやcmd.exeなどのほとんどのコマンドシェルでは、「ファイルグロブ」と呼ばれる、ワイルドカードを使用してファイルのグループを特定する機能がサポートされています。setPatternSyntax() 関数は、正規表現モードとワイルドカードモードを切り替えるために使用されます。ワイルドカードによる一致は、完全な正規表現よりもはるかに単純で、以下の 4 つの機能しか持ちません:
| c | 以下で言及する文字を除き、任意の文字はそれ自体を表します。したがって、c は文字c に一致します。 |
| ? | 任意の1文字に一致します。これは、完全な正規表現における「.」と同じです。 |
| * | 任意の文字を 0 回以上一致させます。完全な正規表現における「.*」と同じです。 |
| [...] | 完全な正規表現と同様に、角括弧で文字の集合を表すことができます。文字クラス内でも外側と同様に、バックスラッシュには特別な意味はありません。 |
「ワイルドカード」モードでは、ワイルドカード文字をエスケープすることはできません。「WildcardUnix 」モードでは、文字「\」でワイルドカードをエスケープします。
たとえば、ワイルドカードモードでファイル名を含む文字列を扱う場合、*.html という式で HTML ファイルを特定できます。これは、0 個以上の文字に続いてドット、さらに 'h'、't'、'm'、'l' が続くパターンに一致します。
文字列をワイルドカード式と照合するには、exactMatch() を使用します。例:
QRegExp rx("*.txt");
rx.setPatternSyntax(QRegExp::Wildcard);
rx.exactMatch("README.txt"); // returns true
rx.exactMatch("welcome.txt.bak"); // returns falsePerl ユーザーへの注意事項
Perl でサポートされている文字クラスの略記のほとんどは、QRegExp でもサポートされています。詳細はcharacters and abbreviations for sets of characters を参照してください。
QRegExp では、文字クラス内を除き、^ は常に文字列の先頭を意味するため、その目的で使用する場合を除き、キャレットは常にエスケープする必要があります。Perl では、キャレットの意味は出現位置に応じて自動的に変化するため、エスケープする必要はほとんどありません。これは$ についても同様で、QRegExp では常に文字列の末尾を意味します。
QRegExp の量指定子は、Perl の貪欲な量指定子と同じです(ただし、note above については後述)。非貪欲なマッチングは個々の量指定子には適用できませんが、パターン内のすべての量指定子には適用できます。たとえば、Perl の正規表現ro+?mに一致させるには、次のように記述します:
QRegExp rx("ro+m");
rx.setMinimal(true);Perlの/i オプションに相当するのは、setCaseSensitivity です(Qt::CaseInsensitive )。
Perlの/g オプションは、loop を使用してエミュレートできます。
QRegExp では、. は任意の文字に一致するため、すべての QRegExp 正規表現は Perl の/s オプションと同等の機能を持っています。QRegExp には Perl の/m オプションに相当する機能はありませんが、入力を行ごとに分割したり、改行を検索する正規表現でループ処理を行ったりするなど、さまざまな方法でこれをエミュレートすることができます。
QRegExpは文字列指向であるため、\A 、\Z 、\z のアサーションは存在しません。\G アサーションはサポートされていませんが、ループを使用してエミュレートすることができます。
Perl の $& は cap(0) またはcapturedTexts()[0] に相当します。$`、$'、$+ に相当する QRegExp の要素はありません。Perl のキャプチャ変数 $1、$2、... は、それぞれ cap(1) またはcapturedTexts()[1]、cap(2) またはcapturedTexts()[2] などに相当します。
パターンを置換するには、QString::replace() を使用します。
Perlの拡張/x 構文はサポートされておらず、ディレクティブ(例: (?i))や正規表現のコメント(例: (?#comment))もサポートされていません。一方、C++のリテラル文字列に関する規則を使用することで、同様の結果を得ることができます:
QRegExp mark("\\b" // word boundary
"[Mm]ark" // the word we want to match
);ゼロ幅の正方向先読みアサーション (?=pattern) およびゼロ幅の負方向先読みアサーション (?!pattern) は、Perl と同じ構文でサポートされています。Perl の後方アサーション、「独立した」部分式、および条件式はサポートされていません。
非キャプチャ括弧も、同じ (?:pattern) という構文でサポートされています。
Perlのsplit関数およびjoin関数に相当する機能については、QString::split() およびQStringList::join() を参照してください。
注:C++ では \ が変換されるため、コード内では2 回記述する必要があります。例えば、 \b は\\b と記述する必要があります。
コード例
QRegExp rx("^\\d\\d?$"); // match integers 0 to 99
rx.indexIn("123"); // returns -1 (no match)
rx.indexIn("-6"); // returns -1 (no match)
rx.indexIn("6"); // returns 0 (matched at position 0)3番目の文字列は「6」に一致します。これは、0から99までの整数を検証するための単純な正規表現です。
QRegExp rx("^\\S+$"); // match strings without whitespace
rx.indexIn("Hello world"); // returns -1 (no match)
rx.indexIn("This_is-OK"); // returns 0 (matched at position 0)2番目の文字列は「This_is-OK」に一致します。文字セットの省略形「\S 」(非空白文字)とアンカーを使用して、空白を含まない文字列に一致するようにしています。
次の例では、「mail」、「letter」、または「correspondence」を含む文字列に一致させますが、単語全体のみ(つまり、「email」には一致しません)に一致させます。
QRegExp rx("\\b(mail|letter|correspondence)\\b");
rx.indexIn("I sent you an email"); // returns -1 (no match)
rx.indexIn("Please write the letter"); // returns 172番目の文字列は「Please write theletter」に一致します。また、(括弧があるため)単語「letter」もキャプチャされます。キャプチャされたテキストは次のように確認できます:
QString captured = rx.cap(1); // captured == "letter"これにより、最初のキャプチャ用括弧(左から右へ数えたキャプチャ用左括弧)からテキストがキャプチャされます。cap(0) は一致した正規表現全体を指すため(ほとんどの正規表現エンジンでは '&' と同等)、括弧のカウントは 1 から始まります。
QRegExp rx("&(?!amp;)"); // match ampersands but not &
QString line1 = "This & that";
line1.replace(rx, "&");
// line1 == "This & that"
QString line2 = "His & hers & theirs";
line2.replace(rx, "&");
// line2 == "His & hers & theirs"ここでは、QRegExpをQString のreplace()関数に渡し、一致したテキストを新しいテキストに置換しています。
QString str = "One Eric another Eirik, and an Ericsson. "
"How many Eiriks, Eric?";
QRegExp rx("\\b(Eric|Eirik)\\b"); // match Eric or Eirik
int pos = 0; // where we are in the string
int count = 0; // how many Eric and Eirik's we've counted
while (pos >= 0) {
pos = rx.indexIn(str, pos);
if (pos >= 0) {
++pos; // move along in str
++count; // count our Eric or Eirik
}
}indexIn() 関数を使用して、文字列内の正規表現を繰り返しマッチングさせました。なお、1文字ずつ先へ進むpos++ の代わりに、pos += rx.matchedLength() と記述することで、すでにマッチング済みの文字列をスキップすることも可能です。この場合、カウントは3となり、「OneEricanotherEirik, and an Ericsson. 「Eiriks,Eric?」と一致しますが、「Ericsson」や「Eiriks」には一致しません。これらは非単語境界で囲まれていないためです。
正規表現の一般的な用途の一つは、区切り文字で区切られたデータの行を、構成要素となるフィールドに分割することです。
str = "The Qt Company Ltd\tqt.io\tFinland";
QString company, web, country;
rx.setPattern("^([^\t]+)\t([^\t]+)\t([^\t]+)$");
if (rx.indexIn(str) != -1) {
company = rx.cap(1);
web = rx.cap(2);
country = rx.cap(3);
}この例では、入力行は会社名、Web アドレス、国の形式になっています。残念ながら、この正規表現はかなり長く、汎用性にも欠けています。フィールドを追加すると、コードが動作しなくなってしまいます。 よりシンプルで優れた解決策は、区切り文字(この場合は「\t 」)を探し、その前後のテキストを取り出すことです。QString::split() 関数は、引数として区切り文字の文字列または正規表現を受け取り、それに応じて文字列を分割することができます。
QStringList field = str.split("\t");ここで、field[0] は会社名、field[1] は Web アドレス、というように続きます。
シェルでのマッチングを模倣するには、ワイルドカードモードを使用できます。
QRegExp rx("*.html");
rx.setPatternSyntax(QRegExp::Wildcard);
rx.exactMatch("index.html"); // returns true
rx.exactMatch("default.htm"); // returns false
rx.exactMatch("readme.txt"); // returns falseワイルドカードによるマッチングは、その簡潔さから便利ですが、任意のワイルドカード正規表現は、完全な正規表現(例:.*\.html$)を使用して定義することも可能です。 ワイルドカードでは、*.htm*を使用しない限り、.html と.htm の両方のファイルに一致させることはできません。ただし、*.htm*を使用すると「test.html.bak」にも一致してしまいます。完全な正規表現を使用すれば、必要な精度を得ることができます。例えば、.*\.html?$ などです。
QRegExpは、setCaseSensitivity() を使用して大文字小文字を区別しないマッチングを行うことができ、setMinimal() を参照して非貪欲マッチングを使用することもできます。デフォルトでは、QRegExpは完全な正規表現を使用しますが、setPatternSyntax() を使用してこれを変更できます。検索は、indexIn() を使用して前方から、またはlastIndexIn() を使用して後方から行うことができます。 キャプチャされたテキストには、capturedTexts() を使用してすべてのキャプチャ文字列のリストを取得するか、cap() を使用して指定されたインデックスのキャプチャ文字列を取得することができます。pos() 関数は、一致したインデックスを受け取り、文字列内で一致した位置を返します(一致がなかった場合は -1 を返します)。
QRegularExpression への移植
Qt 5で導入されたQRegularExpression クラスは、Perl互換の正規表現を実装しており、提供されるAPI、サポートされるパターン構文、および実行速度の点で、QRegExpに比べて大幅な改善が図られています。 最大の違いは、QRegularExpression が単に正規表現を保持しているだけであり、一致の判定が要求されてもその内容が変更されない点です。その代わりに、一致の結果を確認し、キャプチャされた部分文字列を抽出するために、QRegularExpressionMatch オブジェクトが返されます。これは、グローバルマッチングやQRegularExpressionMatchIterator についても同様です。
その他の違いについては、以下に概要を示します。
注: QRegularExpression は、 Perl互換正規表現で利用可能なすべての機能をサポートしているわけではありません。最も顕著な点として、キャプチャグループの名称の重複がサポートされておらず、これを使用すると未定義の挙動を引き起こす可能性があります。これは、Qtの将来のバージョンで変更される可能性があります。
異なるパターン構文
QRegExpからQRegularExpression へ正規表現を移植する際には、パターン自体の変更が必要になる場合があります。
特定の状況下では、QRegExpの許容範囲が広すぎて、QRegularExpression では明らかに無効となるパターンも受け入れられていました。これらのパターンは、それらに基づいて生成されたQRegularExpression オブジェクトが無効となるため、容易に検出できます(QRegularExpression::isValid()を参照)。
また、QRegExp からQRegularExpression へ移植されたパターンによっては、意味論が黙って変更される場合があります。そのため、使用されているパターンを再確認する必要があります。黙って生じる互換性の問題として特に注目すべきケースは以下の通りです:
- 2桁を超える
\xHHHHのような16進エスケープを使用するには、中括弧が必要です。\x2022のようなパターンは、\x{2022}に移植する必要があります。そうしないと、スペース (0x20) の後に文字列"22"が続く場合にも一致してしまいます。一般に、指定された桁数にかかわらず、\xエスケープには常に中括弧を使用することを強く推奨します。 {,n}のような 0 から n までの定量化は、意味論を維持するために{0,n}に変換する必要があります。そうしないと、\d{,3}のようなパターンは、数字の後に正確に"{,3}"という文字列が続く場合に一致してしまいます。- QRegExpはデフォルトでUnicodeを意識したマッチングを行いますが、QRegularExpression では別途オプションが必要です。詳細については以下を参照してください。
- QRegExpにおけるc{.}は、デフォルトで改行文字を含むすべての文字に一致します。一方、QRegularExpression はデフォルトで改行文字を除外します。改行文字を含めるには、QRegularExpression::DotMatchesEverythingOption というパターンオプションを設定してください。
QRegularExpression がサポートする正規表現構文の概要については、PCRE(Perl互換正規表現のリファレンス実装)がサポートするパターン構文を説明したpcrepattern(3)のマニュアルページを参照してください。
QRegExp::exactMatch() からの移植
QRegExp::exactMatch() には 2 つの目的がありました。それは、正規表現を対象文字列に対して完全に一致させることと、部分一致を実装することでした。
QRegExpの完全一致からの移植
完全一致とは、正規表現が対象文字列全体と一致するかどうかを示すものです。たとえば、以下のクラスは、対象文字列「"abc123" 」に対して次のような結果を返します:
| QRegExp::exactMatch() | QRegularExpressionMatch::hasMatch() | |
|---|---|---|
"\\d+" | false | true |
"[a-z]+\\d+" | true | true |
QRegularExpression では完全一致は反映されません。対象の文字列が正規表現と完全に一致することを確実にしたい場合は、QRegularExpression::anchoredPattern()関数を使用してパターンを囲むことができます:
QString p("a .*|pattern");
// re matches exactly the pattern string p
QRegularExpression re(QRegularExpression::anchoredPattern(p));QRegExpの部分一致からの移植
QRegExp::exactMatch() を使用する場合、完全一致が見つからなかったとしても、QRegExp::matchedLength() を呼び出すことで、対象文字列のうち正規表現と一致した部分の長さを確認することができました。返された長さが対象文字列の長さと等しい場合、部分一致が見つかったと結論付けることができました。
QRegularExpression は、適切なQRegularExpression::MatchType を使用することで、部分一致を明示的にサポートしています。
グローバルマッチング
QRegExp APIの制限により、グローバルマッチングを正しく(つまりPerlのように)実装することは不可能でした。特に、0文字に一致するパターン("a*" など)は問題となります。
QRegularExpression::globalMatch() は Perl のグローバルマッチを正しく実装しており、返されるイテレータを使用して各結果を調べることができます。
たとえば、次のようなコードがある場合:
QString subject("the quick fox");
int offset = 0;
QRegExp re("(\\w+)");
while ((offset = re.indexIn(subject, offset)) != -1) {
offset += re.matchedLength();
// ...
}これを次のように書き換えることができます:
QString subject("the quick fox");
QRegularExpression re("(\\w+)");
QRegularExpressionMatchIterator i = re.globalMatch(subject);
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
// ...
}Unicodeプロパティのサポート
QRegExpを使用する場合、\w や\d などの文字クラスは、対応するUnicodeプロパティを持つ文字と一致します。例えば、\d は、UnicodeプロパティNd (10進数字)を持つ任意の文字と一致します。
QRegularExpression を使用する場合、デフォルトではこれらの文字クラスは ASCII 文字にのみ一致します。例えば、\d は、0-9 の ASCII 範囲内の文字にのみ正確に一致します。この動作は、QRegularExpression::UseUnicodePropertiesOption パターンオプションを使用することで変更可能です。
ワイルドカードによるマッチング
QRegularExpression では、ワイルドカードマッチングを直接行う方法はありません。ただし、QRegularExpression::wildcardToRegularExpression() メソッドが用意されており、glob パターンを、その目的で使用できる Perl 互換の正規表現に変換することができます。
たとえば、次のようなコードがある場合:
これを次のように書き換えることができます:
auto wildcard = QRegularExpression(QRegularExpression::wildcardToRegularExpression("*.txt"));ただし、一部のシェル風のワイルドカードパターンは、期待どおりに変換されない場合がある点にご注意ください。以下のサンプルコードは、前述の関数を使って単純に変換すると、何の警告もなく動作しなくなります:
const QString fp1("C:/Users/dummy/files/content.txt");
const QString fp2("/home/dummy/files/content.txt");
QRegExp re1("*/files/*");
re1.setPatternSyntax(QRegExp::Wildcard);
re1.exactMatch(fp1); // returns true
re1.exactMatch(fp2); // returns true
// but converted with QRegularExpression::wildcardToRegularExpression()
QRegularExpression re2(QRegularExpression::wildcardToRegularExpression("*/files/*"));
re2.match(fp1).hasMatch(); // returns false
re2.match(fp2).hasMatch(); // returns falseこれは、デフォルトでは、QRegularExpression::wildcardToRegularExpression() が返す正規表現が完全にアンカー付きになっているためです。アンカーなしの正規表現を取得するには、変換オプションとしてQRegularExpression::UnanchoredWildcardConversion を指定してください:
QRegularExpression re3(QRegularExpression::wildcardToRegularExpression(
"*/files/*", QRegularExpression::UnanchoredWildcardConversion));
re3.match(fp1).hasMatch(); // returns true
re3.match(fp2).hasMatch(); // returns true最小限のマッチング
QRegExp::setMinimal() は、量指定子の貪欲性を単純に反転させることで最小マッチングを実装していました(QRegExp は、*? や+? などの遅延量指定子をサポートしていませんでした)。一方、QRegularExpression は、貪欲、遅延、および所有量指定子をサポートしています。QRegularExpression::InvertedGreedinessOption パターンオプションは、QRegExp::setMinimal()の効果をエミュレートするのに役立ちます。有効にすると、量指定子の貪欲性を反転させます(貪欲なものが遅延型になり、その逆も同様です)。
キャレットモード
QRegularExpression::AnchorAtOffsetMatchOption マッチングオプションを使用すると、QRegExp::CaretAtOffset の動作をエミュレートできます。その他のQRegExp::CaretMode モードに相当するものは存在しません。
QString 、QStringList 、およびQSortFilterProxyModelも参照してください 。
メンバ型のドキュメント
enum QRegExp::CaretMode
CaretMode 列挙型は、正規表現におけるキャレット (^) のさまざまな意味を定義します。取り得る値は以下の通りです:
| 定数 | 値 | 説明 |
|---|---|---|
QRegExp::CaretAtZero | 0 | キャレットは、検索対象の文字列におけるインデックス 0 に対応します。 |
QRegExp::CaretAtOffset | 1 | キャレットは、検索の開始オフセットに対応します。 |
QRegExp::CaretWontMatch | 2 | キャレットは決して一致しません。 |
enum QRegExp::PatternSyntax
パターンの意味を解釈するために使用される構文。
| 定数 | 値 | 説明 |
|---|---|---|
QRegExp::RegExp | 0 | Perl 風の豊富なパターンマッチング構文。これがデフォルトです。 |
QRegExp::RegExp2 | 3 | RegExpと同様ですが、greedy quantifiers が使用されます。(Qt 4.2で導入されました。) |
QRegExp::Wildcard | 1 | これは、シェル(コマンドインタプリタ)で「ファイルグロブ」に使用されるものと同様の、シンプルなパターンマッチング構文を提供します。QRegExp wildcard matching を参照してください。 |
QRegExp::WildcardUnix | 4 | これは Wildcard に似ていますが、Unix シェルと同様の挙動を示します。ワイルドカード文字は「\」でエスケープできます。 |
QRegExp::FixedString | 2 | パターンは固定の文字列です。これは、すべてのメタ文字がescape() を使用してエスケープされた文字列に対して RegExp パターンを適用することと同等です。 |
QRegExp::W3CXmlSchema11 | 5 | パターンは、W3C XML Schema 1.1 仕様で定義されている正規表現です。 |
setPatternSyntax()も参照してください 。
メンバ関数のドキュメント
QRegExp::QRegExp()
空の正規表現を構築します。
isValid() およびerrorString()も参照してください 。
[explicit] QRegExp::QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, QRegExp::PatternSyntax syntax = RegExp)
指定されたpattern 文字列に対する正規表現オブジェクトを生成します。syntax がWildcard の場合、パターンはワイルドカード表記で指定する必要があります。デフォルトはRegExp です。cs がQt::CaseInsensitive でない限り、パターンは大文字と小文字を区別します。マッチングは貪欲(最大)方式ですが、setMinimal()を呼び出すことで変更可能です。
setPattern()、setCaseSensitivity()、およびsetPatternSyntax()も参照してください 。
QRegExp::QRegExp(const QRegExp &rx)
rx のコピーとして正規表現を構築します。
operator=()も参照してください 。
[noexcept] QRegExp::~QRegExp()
正規表現を破棄し、その内部データをクリーンアップします。
QString QRegExp::cap(int nth = 0) const
nth サブ式によってキャプチャされたテキストを返します。一致した文字列全体はインデックス 0 となり、括弧で囲まれたサブ式のインデックスは 1 から始まります(非キャプチャ用の括弧は除く)。
QRegExp rxlen("(\\d+)(?:\\s*)(cm|inch)");
int pos = rxlen.indexIn("Length: 189cm");
if (pos > -1) {
QString value = rxlen.cap(1); // "189"
QString unit = rxlen.cap(2); // "cm"
// ...
}cap() によって一致した要素の順序は以下の通りです。最初の要素 cap(0) は、一致した文字列全体です。それ以降の各要素は、次にくるキャプチャ用の左括弧に対応します。したがって、cap(1) は最初のキャプチャ用左括弧のテキスト、cap(2) は 2 番目のキャプチャ用左括弧のテキスト、というように続きます。
capturedTexts() およびpos()も参照してください 。
int QRegExp::captureCount() const
正規表現に含まれるキャプチャの数を返します。
QStringList QRegExp::capturedTexts() const
キャプチャされたテキスト文字列のリストを返します。
リストの最初の文字列は、一致した文字列全体です。その後の各リスト要素には、正規表現の(キャプチャ)部分式に一致した文字列が含まれます。
例:
QRegExp rx("(\\d+)(\\s*)(cm|inch(es)?)");
int pos = rx.indexIn("Length: 36 inches");
QStringList list = rx.capturedTexts();
// list is now ("36 inches", "36", " ", "inches", "es")上記の例では、存在はするが関心のない要素もキャプチャされてしまいます。この問題は、非キャプチャ用の括弧を使用することで解決できます:
QRegExp rx("(\\d+)(?:\\s*)(cm|inch(?:es)?)");
int pos = rx.indexIn("Length: 36 inches");
QStringList list = rx.capturedTexts();
// list is now ("36 inches", "36", "inches")なお、リストを反復処理する場合は、コピーに対して反復処理を行う必要があります。例えば、
QStringList list = rx.capturedTexts();
QStringList::iterator it = list.begin();
while (it != list.end()) {
myProcessing(*it);
++it;
}正規表現によっては、不確定な回数に一致する場合があります。例えば、入力文字列が「Offsets: 12 14 99 231 7」で、正規表現rx が(\d+)+である場合、一致したすべての数値のリストが得られることを期待します。 しかし、rx.indexIn(str) を呼び出した後、capturedTexts()はリスト("12", "12")を返します。つまり、マッチ全体が"12"であり、最初にマッチした部分式も"12"だったことになります。正しい方法は、loop 内でcap()を使用することです。
文字列リスト内の要素の順序は以下の通りです。最初の要素は、一致した文字列全体です。それ以降の各要素は、次のキャプチャ用左括弧に対応します。 したがって、capturedTexts()[1]は最初のキャプチャされる括弧のテキスト、capturedTexts()[2]は2番目のキャプチャされる括弧のテキストとなり、以下同様です(他の正規表現言語における$1、$2などに相当します)。
Qt::CaseSensitivity QRegExp::caseSensitivity() const
正規表現が大文字小文字を区別して一致した場合は `Qt::CaseSensitive ` を返し、そうでない場合は `Qt::CaseInsensitive` を返します。
setCaseSensitivity()、patternSyntax()、pattern()、およびisMinimal()も参照してください 。
int QRegExp::countIn(const QString &str) const
str 内で、この正規表現が一致した回数を返します。
indexIn()、lastIndexIn()、およびreplaceIn()も参照してください 。
QString QRegExp::errorString() const
正規表現パターンが無効である理由を説明するテキスト文字列を返します。ただし、エラーが発生していない場合は「no error occurred」を返します。
isValid()も参照してください 。
[static] QString QRegExp::escape(const QString &str)
すべての正規表現の特殊文字をバックスラッシュでエスケープした文字列「str 」を返します。特殊文字とは、$、(、)、*、+、.、?、[、、]、^、{、|、} です。
例:
この関数は、正規表現パターンを動的に構築するのに役立ちます:
setPatternSyntax()も参照してください 。
bool QRegExp::exactMatch(const QString &str) const
この正規表現が `str ` と完全に一致した場合、true を返します。一致しない場合は、false を返します。文字列のどの部分が一致したかを確認するには、matchedLength() を呼び出します。
与えられた正規表現文字列 R に対して、exactMatch("R") はindexIn("^R$") と同等です。これは、exactMatch() が事実上、正規表現を文字列の先頭アンカーと末尾アンカーで囲むためですが、matchedLength() の設定方法が異なる点が異なります。
たとえば、正規表現がblue の場合、exactMatch() は、入力blue に対してのみtrue を返します。入力bluebell 、blutak 、lightblue に対して、exactMatch() はfalse を返し、matchedLength() はそれぞれ 4、3、0 を返します。
const ですが、この関数はmatchedLength()、capturedTexts()、およびpos() を設定します。
indexIn() およびlastIndexIn()も参照してください 。
QStringList QRegExp::filterList(const QStringList &stringList) const
stringList 内で、この正規表現に一致するすべての文字列のリストを返します。
int QRegExp::indexIn(const QStringList &list, int from) const
インデックス位置from から前方へ検索し、list 内でこの正規表現に完全に一致する最初の項目のインデックス位置を返します。一致する項目がない場合は -1 を返します。
lastIndexIn() およびexactMatch()も参照してください 。
int QRegExp::indexIn(const QString &str, int offset = 0, QRegExp::CaretMode caretMode = CaretAtZero) const
str 内のoffset の位置(デフォルトは0)から一致する部分を探します。offset が-1の場合は最後の文字から、-2の場合は最後から2番目の文字から、というように検索が開始されます。
最初の一致した位置を返します。一致がなかった場合は -1 を返します。
caretMode パラメータを使用することで、^がインデックス0で一致するか、offset で一致するかを指定できます。
QString::indexOf()、QString::contains()、あるいはQStringList::filter() を使用することをお勧めします。一致した文字列を置換するには、QString::replace() を使用します。
例:
QString str = "offsets: 1.23 .50 71.00 6.00";
QRegExp rx("\\d*\\.\\d+"); // primitive floating point matching
int count = 0;
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
++count;
pos += rx.matchedLength();
}
// pos will be 9, 14, 18 and finally 24; count will end up as 4const であるにもかかわらず、この関数はmatchedLength()、capturedTexts()、およびpos() を設定します。
QRegExp がワイルドカード式(setPatternSyntax()を参照)であり、文字列をそのワイルドカード式全体に対して照合したい場合は、この関数の代わりにexactMatch()を使用してください。
lastIndexIn() およびexactMatch()も参照してください 。
bool QRegExp::isEmpty() const
パターン文字列が空の場合、true を返します。それ以外の場合は false を返します。
空の文字列に対して空のパターンを指定して `exactMatch()` を呼び出すと `true` を返します。それ以外の場合は、文字列全体に対して処理が行われるため、false を返します。任意の文字列に対して空のパターンで `indexIn()` を呼び出すと、空のパターンが文字列の先頭の「空」に一致するため、開始オフセット(デフォルトは 0)が返されます。この場合、`matchedLength()` が返す一致の長さは 0 になります。
QString::isEmpty() を参照してください。
bool QRegExp::isMinimal() const
最小(非貪欲)マッチングが有効になっている場合は `true ` を返し、そうでない場合は `false` を返します。
caseSensitivity() およびsetMinimal()も参照してください 。
bool QRegExp::isValid() const
正規表現が有効な場合は `true ` を返し、そうでない場合は `false` を返します。無効な正規表現は決して一致しません。
パターン[a-zは、閉じ角括弧がないため、無効なパターンの例です。
正規表現の有効性は、ワイルドカードフラグの設定によっても左右される場合があることに注意してください。たとえば、*.htmlは有効なワイルドカード正規表現ですが、完全な正規表現としては無効です。
errorString()も参照してください 。
int QRegExp::lastIndexIn(const QStringList &list, int from) const
インデックス位置from から逆方向に検索し、list 内でこの正規表現に完全に一致する最後の項目のインデックス位置を返します。from が-1(デフォルト)の場合、検索は最後の項目から開始されます。一致する項目がない場合は-1を返します。
QRegExp::exactMatch()も参照してください 。
int QRegExp::lastIndexIn(const QString &str, int offset = -1, QRegExp::CaretMode caretMode = CaretAtZero) const
str 内の位置offset から逆方向に一致する箇所を検索します。offset が -1(デフォルト)の場合、検索は最後の文字から開始され、-2 の場合は最後から 2 番目の文字から開始されます。
最初の一致した位置を返します。一致がなかった場合は -1 を返します。
caretMode パラメータを使用することで、^がインデックス0で一致するか、offset で一致するかを指定できます。
この関数は const ですが、matchedLength()、capturedTexts()、pos() を設定します。
警告: 逆方向の検索は 、順方向の検索よりもはるかに遅くなります。
indexIn() およびexactMatch()も参照してください 。
int QRegExp::matchedLength() const
最後に一致した文字列の長さを返します。一致する文字列がない場合は -1 を返します。
exactMatch()、indexIn()、およびlastIndexIn()も参照してください 。
QString QRegExp::pattern() const
正規表現のパターン文字列を返します。このパターンは、patternSyntax() の設定に応じて、正規表現構文またはワイルドカード構文のいずれかとなります。
setPattern()、patternSyntax()、およびcaseSensitivity()も参照してください 。
QRegExp::PatternSyntax QRegExp::patternSyntax() const
正規表現で使用される構文を返します。デフォルトは `QRegExp::RegExp` です。
setPatternSyntax()、pattern()、およびcaseSensitivity()も参照してください 。
int QRegExp::pos(int nth = 0) const
検索対象の文字列内で、nth によってキャプチャされたテキストの位置を返します。nth が0(デフォルト)の場合、pos()は一致した部分全体の位置を返します。
例:
QRegExp rx("/([a-z]+)/([a-z]+)");
rx.indexIn("Output /dev/null"); // returns 7 (position of /dev/null)
rx.pos(0); // returns 7 (position of /dev/null)
rx.pos(1); // returns 8 (position of dev)
rx.pos(2); // returns 12 (position of null)長さが 0 のマッチの場合、pos() は常に -1 を返します(たとえば、cap(4) が空文字列を返す場合、pos(4) は -1 を返します)。これは実装上の仕様です。
cap() およびcapturedTexts()も参照してください 。
QString QRegExp::removeIn(const QString &str) const
正規表現「str 」のすべての出現箇所を削除し、結果を返します
replaceIn(str, QString()) と同じ動作をします。
indexIn()、lastIndexIn()、およびreplaceIn()も参照してください 。
QString QRegExp::replaceIn(const QString &str, const QString &after) const
str 内のこの正規表現のすべての出現箇所をafter に置き換え、その結果を返します。
capturing parentheses を含む正規表現において、 \1, \2, ... がafter 内で出現する箇所はすべてrx に置換されます。cap(1), cap(2), ...
indexIn()、lastIndexIn()、およびQRegExp::cap()も参照してください 。
QStringList QRegExp::replaceIn(const QStringList &stringList, const QString &after) const
stringList の各要素において、この正規表現に一致する箇所をすべてafter に置換します。文字列リストへの参照を返します。
void QRegExp::setCaseSensitivity(Qt::CaseSensitivity cs)
大文字と小文字を区別する検索をcs に設定します。
cs がQt::CaseSensitive の場合、\.txt$は readme.txt には一致しますが、README.TXT には一致しません。
caseSensitivity()、setPatternSyntax()、setPattern()、およびsetMinimal()も参照してください 。
void QRegExp::setMinimal(bool minimal)
最小マッチングを有効または無効にします。minimal がfalseの場合、マッチングは貪欲(最大)モードとなり、これがデフォルトの設定です。
例えば、入力文字列が「We must be <b>bold</b>, very <b>bold</b>!」で、パターンが<b>.*</b> であるとします。 デフォルトの貪欲(最大)マッチングでは、一致結果は「We must be<b>bold</b>, very <b>bold</b>!」となります。 しかし、最小(非貪欲)マッチングでは、最初の一致は「We must be<b>bold</b>, very <b>bold</b>!」となり、2番目の一致も「We must be <b>bold</b>, very<b>bold</b>!」となります。 実際には、代わりにパターン<b>[^<]*</b>を使用することもありますが、これはネストされたタグに対しては依然として失敗します。
isMinimal() およびsetCaseSensitivity()も参照してください 。
void QRegExp::setPattern(const QString &pattern)
パターン文字列を「pattern 」に設定します。大文字小文字の区別、ワイルドカード、および最小一致のオプションは変更されません。
pattern()、setPatternSyntax()、およびsetCaseSensitivity()も参照してください 。
void QRegExp::setPatternSyntax(QRegExp::PatternSyntax syntax)
正規表現の構文モードを設定します。デフォルトは `QRegExp::RegExp` です。
syntax をQRegExp::Wildcard に設定すると、シェル風の単純なQRegExp wildcard matching が有効になります。例えば、r*.txtはワイルドカードモードではreadme.txt という文字列に一致しますが、readme には一致しません。
syntax をQRegExp::FixedString に設定すると、そのパターンは単なる文字列として解釈されます。その場合、特殊文字(例:バックスラッシュ)をエスケープする必要はありません。
patternSyntax()、setPattern()、setCaseSensitivity()、およびescape()も参照してください 。
QStringList QRegExp::splitString(const QString &str, Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const
str を、この正規表現に一致する箇所ごとに部分文字列に分割し、それらの文字列のリストを返します。この正規表現が文字列内のどこにも一致しない場合、split() はstr を含む要素が1つのリストを返します。
behavior がQt::KeepEmptyParts に設定されている場合、空のフィールドも結果のリストに含まれます。
QStringList::join() およびQString::split()も参照してください 。
[noexcept] void QRegExp::swap(QRegExp &other)
正規表現「other 」を、この正規表現と置き換えます。この操作は非常に高速で、失敗することはありません。
QRegExp::operator QVariant() const
正規表現をQVariant
bool QRegExp::operator!=(const QRegExp &rx) const
この正規表現が `rx` と等しくない場合は `true ` を返し、等しい場合は `false` を返します。
operator==()も参照してください 。
[noexcept] QRegExp &QRegExp::operator=(QRegExp &&other)
other をこのQRegExp インスタンスに割り当てます。
QRegExp &QRegExp::operator=(const QRegExp &rx)
正規表現 `rx ` をコピーし、そのコピーへの参照を返します。大文字小文字の区別、ワイルドカード、および最小一致のオプションも同様にコピーされます。
bool QRegExp::operator==(const QRegExp &rx) const
この正規表現が `rx` と等しい場合は `true ` を返し、そうでない場合は `false` を返します。
2つのQRegExp オブジェクトは、パターン文字列および大文字小文字の区別、ワイルドカード、最小一致に関する設定が同じである場合に等しいとみなされます。
関連する非メンバー
[noexcept] size_t qHash(const QRegExp &key, size_t seed = 0)
`key` のハッシュ値を、計算のシードとして `seed ` を使用して返します。
QDataStream &operator<<(QDataStream &out, const QRegExp ®Exp)
正規表現 `regExp ` をストリーム `out` に書き込みます。
「Qt データ型のシリアライズ」も参照してください 。
QDataStream &operator>>(QDataStream &in, QRegExp ®Exp)
ストリーム `in ` から正規表現を読み取り、`regExp` に格納します。
「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.