QRegExp Class
QRegExp クラスは、正規表現を使ったパターン・マッチを提供します。詳細...
Header: | #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) |
QVariant | 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 への古いコードの移植に関するガイドラインについては、{QRegularExpression への移植 } を参照してください。
正規表現(regexp)は、テキストの部分文字列をマッチさせるためのパターンです。これは多くの文脈で有用である、
検証 | 正規表現では、部分文字列がある基準を満たしているかどうかをテストすることができます。 |
検索 | 正規表現は、単純な部分文字列マッチングよりも強力なパターンマッチを提供します。例えば、mail、letter、correspondenceのどれかにマッチし、email、mailman、mailer、letterboxのどれにもマッチしない場合などです。 |
検索と置換 | 正規表現では、ある部分文字列のすべてを別の部分文字列に置き換えることができます。例えば、&の後にすでにamp;が付いている場合を除き、&のすべてを&に置き換えることができます。 |
文字列の分割 | 正規表現を使って、文字列を分割する箇所を特定することができます(タブ区切りの文字列の分割など)。 |
正規表現についての簡単な紹介、Qt の正規表現言語の説明、いくつかの例、そして関数のドキュメントがあります。QRegExp は Perl の正規表現言語をモデルにしています。Unicode を完全にサポートしています。QRegExpは、コマンドシェルに見られる機能に似た、より単純なワイルドカードモードで使用することもできます。QRegExpが使用する構文規則は、setPatternSyntax()で変更することができます。QRegExp::FixedStringこれは、マッチするパターンがプレーン文字列として解釈されることを意味し、特殊文字(バックスラッシュなど)はエスケープされません。
正規表現に関する優れたテキストは、Jeffrey E. F. Friedl著「Mastering Regular Expressions(Third Edition)」ISBN 0-596-52812-4です。
注: Qt 5では、新しいQRegularExpression クラスが正規表現のPerl互換の実装を提供し、QRegExpの代わりに推奨されます。
はじめに
正規表現は式、量化子、アサーションから構成されます。最も単純な式は文字で、例えばxや5 です。式は角括弧で囲まれた文字の集合であることもあります。[ABCD]はA、B、C、Dにマッチします。これと同じ式を[A-D]と書くことができ、英語のアルファベットの大文字にマッチする式は[A-Z]と書かれます。
x{1,1}は、1つのxだけにマッチすることを意味します。x{1,5}は、少なくとも1つのxを含み、5つ以下のx文字のシーケンスにマッチすることを意味します。
一般に正規表現では、バランスの取れた括弧やタグをチェックすることはできない。例えば、<b>
タグが入れ子になっていない場合、<b>
を開き、</b>
を閉じる正規表現を書くことができますが、<b>
タグが入れ子になっている場合、同じ正規表現は<b>
を開き、</b>
を閉じるタグにマッチします。フラグメント<b>bold <b>bolder</b></b>
の場合、最初の<b>
は最初の</b>
とマッチすることになり、これは正しくない。しかし、入れ子になった括弧やタグに正しくマッチする正規表現を書くことは可能である。入れ子の数が固定で既知でない場合、失敗しない正規表現を書くことは不可能である。
少なくとも1桁は必要なので、1桁にちょうど1回マッチする[0-9]{1,1}式から始めます。この正規表現は0から9までの整数にマッチします。99までの整数にマッチするには、最大出現回数を2回に増やし、正規表現は[0-9]{1,2}となります。この正規表現は、0から99までの整数にマッチするという本来の要件を満たしますが、文字列の途中で発生する整数にもマッチします。マッチする整数を文字列全体にしたい場合は、アンカー・アサーション^(キャレット) と$(ドル) を使わなければならない。正規表現の最初の文字が^の場合は、正規表現が文字列の先頭からマッチすることを意味する。が正規表現 の最後の文字である場合、正規表現は文字列の最後までマッチしなければならな いことを意味する。正規表現は^[0-9]{1,2}$ となる。アサーション、例えば^や$ は、文字にマッチするのではなく、文字列の中の場所にマッチすることに 注意。
他の場所で正規表現について説明されているのを見たことがある場合、ここで 示されているものとは違って見えるかもしれない。これは、いくつかの文字の集合やいくつかの量 子は非常に一般的であるため、それらを表現するために特別な記号が与えられて いるからです。0-9]は記号[d]で置き換えることができます。つまり、x{1,1}はx と同じです。したがって、0から99までのマッチャーは^d{1,2}$と書くことができます。また、^dd{0,1}$とも書ける。つまり、文字列の先頭から1桁をマッチし、すぐ に0桁か1桁をマッチする。実際には、^d?$と書く。は量化子{0,1}の省略形である。は式を省略可能にする。正規表現^dd?$は、文字列の先頭から1桁マッチし、すぐに0桁または1桁追加され、 すぐに文字列が終了することを意味する。
例えば、'email'、'mailman'、'mailer'、'letterbox'などである。完全に表現すると、正規表現は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 word boundaryassertions で囲みます:\b(mail|letter|correspondence)。これで正規表現が意味するのは単語境界にマッチし、その後に括弧内の正規表現が続き、その後に単語境界が続く。\bアサーションは、文字ではなく正規表現内の位置にマッチします。単語境界とは、スペース、改行、文字列の先頭または末尾など、単語以外の文字のことです。
アンパサンド文字をHTMLエンティティ&で置き換えたい場合、マッチする正規表現は単純に&です。しかしこの正規表現は、すでにHTMLエンティティに変換されているアンパサンドにもマッチします。まだamp;がついていないアンパサンドだけを置換したいのです。そのためには、(?!__)という負のルックアヘッド・アサーションが必要です。正規表現は、&(?!amp;)、つまり、amp;がついて いない アンパサンドにマッチする、と書くことができる。
Eric'と'Eirik'の出現を文字列の中ですべて数えたい場合、2つの有効な解は、'Eric|Eirik'˶と'Ei?ri[ck]˶'です。単語境界アサーション'˶'は、'Ericsson'など、どちらかの名前を含む単語とのマッチングを避けるために必要です。2番目の正規表現は、'Eric'、'Erik'、'Eiric'、'Eirik'など、必要以上に多くのスペルにマッチすることに注意してください。
上述した例のいくつかは、code examples セクションに実装されている。
文字集合の文字と省略形
要素 | 意味 |
---|---|
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 文字にマッチします。 |
\(0x0000~0xFFFFの間) に対応するUnicode文字にマッチします。 | 8進数ooo(0~0377)に対応するASCII/Latin1文字にマッチします。 |
.(ドット) | 任意の文字 (改行を含む) にマッチします。 |
\d | 数字(QChar::isDigit())にマッチします。 |
\D | 数字以外の文字にマッチします。 |
\s | 空白文字にマッチします (QChar::isSpace())。 |
\S | 空白文字以外の文字にマッチします。 |
\w | 単語文字 (QChar::isLetterOrNumber()、QChar::isMark()、または '_') にマッチします。 |
\W | 単語以外の文字にマッチします。 |
\n | n番目の後方参照。 |
注意:C++ コンパイラは文字列内のバックスラッシュを変換します。\\
正規表現にバックスラッシュを含めるには、バックスラッシュを2回入力します。\\\\
バックスラッシュ文字そのものにマッチさせるには、4 回入力します。
文字のセット
角括弧は、角括弧に含まれるすべての文字にマッチすることを意味する。上述した文字セットの省略形は、角括弧の中の文字セットに含めることができる。文字セットの省略形と以下の2つの例外を除いて、文字は角括弧の中で特別な意味を持ちません。
^ | キャレットは、それが最初の文字として (つまり、冒頭の角括弧の直後に) 現れた場合、その文字セットを否定する。[abc]は 'a' か 'b' か 'c' にマッチするが、[^abc] は'a' か 'b' か 'c'以外にマッチする。 |
- | ダッシュは文字の範囲を示す。[W-Z]は'W'か'X'か'Y'か'Z'にマッチする。 |
定義済みの文字セットの略語を使う方が、プラットフォームや言語間で文字範囲を使うよりも移植性が高い。例えば、[0-9]は西洋のアルファベットの数字にマッチしますが、"˶" は どのアルファベットの数字にもマッチします。
注意: 他の正規表現文書では、文字の集合はしばしば "文字クラス "と呼ばれます。
量記号
デフォルトでは、式は自動的に{1,1}で量化されます。以下のリストでは、Eはexpressionを表します。式は文字、または文字の集合の省略形、または角括弧内の文字の集合、または括弧内の式です。
E? | この量化子は、式が見つかっても見つからなくてもマッチするので、前の式はオプションであることを意味します。E?はE{0,1}と同じである。例えば、dents? は'dent'または'dents'にマッチする。 |
E+ | E+は E{1,}と同じ。例えば、0+は'0'、'00'、'000'などにマッチする。 |
E* | E {0,}と同じ。E*はE{0,}と同じである。例えば、空白で終わる文字列にマッチさせる式で、\s*$ を使用すると、すべての文字列にマッチしてしまいます。末尾に少なくとも1つの空白文字がある文字列にマッチする正しい正規表現は\s+$ です。 |
E{n} | E{n}は Eを n回繰り返すのと同じです。例えば、x{5}はxxxxx と同じです。また、E{n,n}(例:x{5,5})とも同じです。 |
E{n,} | 少なくともn個の Eにマッチする。 |
E{,m} | E{,m}は E{0,m}と同じです。 |
E{n,m} | 少なくともn個、最大m個のEにマッチする。 |
直前の文字以上に量化子を適用するには、括弧を使って文字をグループ化します。たとえば、tag+は、't'の後に'a'が続き、その後に少なくとも1つの'g'が続く場合にマッチし、(tag)+は、少なくとも1つの'tag'が出現する場合にマッチする。
注意:量化子は通常「欲張り」である。常にできる限り多くのテキストにマッチする。例えば、0+は、最初に見つけたゼロと、最初のゼロの後に連続するすべてのゼロにマッチします。20005'に適用すると、'20005'にマッチします。量化子は、setMinimal() を参照。
テキストのキャプチャ
括弧を使うと、要素をグループ化して定量化したりキャプチャしたりすることができます。たとえば、mail|letter|correspondenceという式が文字列にマッチした場合、どれかの単語がマッチしたことはわかりますが、どれがマッチしたかはわかりません。そのため、(mail|letter|correspondence)を使ってこの正規表現と "I sent you some email" という文字列をマッチさせた場合、cap() やcapturedTexts() 関数を使ってマッチした文字、この場合は 'mail' を抽出することができます。
キャプチャしたテキストは正規表現内で使用することができます。キャプチャしたテキストを参照するには、cap ()と同じように、1 からインデックス付けされる後方参照を使用します。これは、単語境界、1つ以上の単語文字、1つ以上の非単語文字、最初の括弧で囲まれた式 と同じテキスト、単語境界の順にマッチすることを意味します。
もし括弧を純粋にグループ分けのために使い、キャプチャーのために使いたくない場合は、例えば(?:green|blue)のように、キャプチャーのない構文を使うことができます。捕捉しない括弧は'(?:'で始まり、')'で終わります。この例では'green'か'blue'のどちらかにマッチしますが、マッチをキャプチャしないので、マッチしたかどうかだけがわかり、実際にどの色を見つけたかはわかりません。キャプチャしない括弧を使う方が、キャプチャする括弧を使うよりも、正規表現エンジンが帳簿を管理する手間が省けるので効率的です。
キャプチャする括弧もしない括弧も入れ子にすることができます。
歴史的な理由から、捕捉括弧に適用される量化子(*など)は、他の量化子よりも「貪欲」である。例えば、a*(a*)は、cap(1) == "aaa "で "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 を参照のこと)。 |
$ | ドルは文字列の終わりを意味します。例えば、 \ds*$は、数字で終わる文字列(空白が続く場合もある)にマッチする。リテラル$ にマッチさせたい場合は、\\$ と書いてエスケープしなければならない。 |
\b | 単語の境界。例えば、正規表現 \bOKb は、単語境界(例えば文字列の開始や空白)の直後に文字'O'をマッチさせ、次に 別の単語境界(例えば文字列の終了や空白)の直前に文字'K'をマッチさせるこ とを意味する。ただし、アサーションは実際には空白とマッチしないので、( \bOKb)と書いてマッチした場合、文字列が "It'sOKnow" であっても 'OK' しか含まれないことに注意。 |
\B | 非単語境界。このアサーションは "曖昧さ "が偽であればどこでも真です。例えば、"Left on "で˶BonBを検索すると、マッチは失敗します(スペースと文字列の終わりは非単語境界ではありません)が、"tonne"ではマッチします。 |
(?=E) | 正の先読み。このアサーションは、正規表現内のこの時点で式がマッチする場合に真となる。例えば、const(?=s+char)は、'staticconstchar *'のように、'char'が続くときは常に'const'にマッチする。(consts+char は 'staticconst char*' にマッチする)。 |
(?!E) | 負の先読み。このアサーションは、正規表現内のこの時点で式がマッチしない場合に真となる。例えば、const(?!˶s+char)は、'char' が続く場合を除き、'const' にマッチします。 |
ワイルドカード・マッチング
bashや cmd.exeのようなほとんどのコマンドシェルは、ワイルドカードを使用してファイルのグループを識別する機能である「ファイルグロビング」をサポートしています。正規表現モードとワイルドカード・モードを切り替えるには、setPatternSyntax ()関数を使用する。ワイルドカード・マッチングは完全な正規表現よりもはるかに単純で、4つの機能しかない:
c | 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 false
Perlユーザーのためのメモ
characters and abbreviations for sets of charactersPerl でサポートされている文字クラスの省略形のほとんどは QRegExp でサポートされています。
QRegExpでは、文字クラス内を除けば、^
は常に文字列の開始を意味するので、キャレットはその目的で使用されない限り、常にエスケープされなければなりません。Perlでは、キャレットが出現する場所によって自動的に意味が変わるので、キャレットをエスケープする必要はほとんどありません。QRegExpでは常に文字列の終わりを意味する$
。
QRegExpの量化子はPerlの貪欲な量化子と同じです(ただし、note above を参照してください)。非貪欲マッチングは個々の量子に適用することはできませんが、パターン内のすべての量子に適用することができます。例えば、Perlの正規表現ro+?
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アサーションはありません。をエミュレートすることができます。
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 );
Perlと同じ構文で、ゼロ幅の正のルックアヘッド・アサーション(?=pattern)とゼロ幅の負のルックアヘッド・アサーション(?Perl の lookbehind アサーション、"独立 "部分式、条件式はサポートされていません。
キャプチャしない括弧も、同じ (?:pattern) 構文でサポートされています。
Perlのsplit関数とjoin関数に相当するものについては、QString::split()とQStringList::join()を参照してください。
注:C++は、"˶"を2回変換するので、"˶"は"˶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)
番目の文字列は'This_is-OK'にマッチする。空白を含まない文字列にマッチするように、文字セットの省略形 '˶S'(空白なし)とアンカーを使用しています。
以下の例では、'mail'、'letter'、'correspondence'を含む文字列にマッチしますが、単語全体にのみマッチします。
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 17
2番目の文字列は、"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"
ここでは、QString の replace() 関数に QRegExp を渡して、マッチしたテキストを新しいテキストに置き換えています。
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() 関数を使って、文字列中の正規表現に繰り返しマッチさせています。pos++
、1文字ずつ先に進むのではなく、pos += rx.matchedLength()
、すでにマッチした文字列をスキップするように書くこともできる。カウントは3になり、「エリックが一人、エイリークがもう一人、エリクソンが一人」とマッチする。Eiriks、Ericは何人でしょう?'にマッチする。'Ericsson'や'Eiriks'には単語以外の境界がないのでマッチしない。
正規表現の一般的な使い方の1つは、区切りデータの行をそれぞれのフィールドに分割することである。
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); }
この例では、入力行は会社名、ウェブアドレス、国という形式になっている。これ以上フィールドを増やすとコードが壊れてしまう。もっとシンプルで良い解決策は、区切り文字、この例では'˶'を探して、その周りのテキストを取ることです。QString::split ()関数は、区切り文字列または正規表現を引数として取り、それに応じて文字列を分割することができます。
QStringList field = str.split("\t");
ここでは、field[0]が会社、field[1]がウェブ・アドレス、といった具合だ。
シェルのマッチングを模倣するには、ワイルドカード・モードを使用します。
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
ワイルドカード・マッチングは単純なので便利だが、どのようなワイルドカード 正規表現も完全正規表現を使って定義できる。test.html.bak'にもマッチする*.htm*を使わない限り、ワイルドカードで.html
と.htm
の両方のファイルにマッチさせることはできない。完全な正規表現を使えば、必要な精度が得られる。
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 に移植されたパターンが、無言のうちにセマンティクスを変更している場合もあります。したがって、使用するパターンを見直す必要がある。サイレント非互換性の最も顕著なケースは以下のとおりです:
\xHHHH
のような2桁以上の16進数エスケープを使用するには、中括弧が必要です。\x2022
のようなパターンは、\x{2022}
に移植する必要がある。さもないと、スペース(0x20
)の後に文字列"22"
が続くパターンにマッチしてしまう。一般に、桁数に関係なく、\x
のエスケープには中括弧を使うことを強く推奨します。{,n}
のような0対nの数量化は、セマンティクスを保持するために{0,n}
に移植する必要がある。そうでないと、\d{,3}
のようなパターンは、数字に続く正確な文字列"{,3}"
にマッチしてしまいます。- QRegExpはデフォルトでUnicodeを意識したマッチングを行いますが、QRegularExpression は別のオプションが必要です。
- QRegExpのc{.}は、デフォルトで改行文字を含むすべての文字にマッチします。QRegularExpression は、デフォルトで改行文字を除外します。改行文字を含めるには、QRegularExpression::DotMatchesEverythingOption patternオプションを設定します。
QRegularExpression でサポートされている正規表現構文の概要については、PCRE(Perl互換正規表現のリファレンス実装)でサポートされているパターン構文について説明したpcrepattern(3)man ページを参照してください。
QRegExp::exactMatch() からの移植
QRegExp::exactMatch() は二つの目的を果たしました: 正規表現と対象文字列を正確にマッチさせることと、 部分マッチを実装することです。
QRegExp の完全一致からの移植
完全マッチングは、正規表現が対象文字列全体にマッチするかどうかを示します。例えば、"abc123"
:
QRegExp::exactMatch() | QRegularExpressionMatch::hasMatch() | |
---|---|---|
"\\d+" | false | 真 |
"[a-z]+\\d+" | 真 | 真 |
完全一致はQRegularExpression には反映されません。 subject 文字列が正規表現に完全に一致することを確認したい場合は、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のように)実装することは不可能でした。特に、("a*"
のような)0 文字にマッチするパターンは問題です。
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(); // ... }
ユニコードプロパティのサポート
QRegExp を使用する場合、\w
、\d
などの文字クラスは、対応する Unicode プロパティを持つ文字にマッチします。例えば、\d
は、UnicodeNd
(10進数) プロパティを持つあらゆる文字にマッチします。
これらの文字クラスは、QRegularExpression を使用する場合、デフォルトでは ASCII 文字にのみマッチします:例えば、\d
は0-9
ASCII 範囲の文字に正確にマッチします。この動作を変更するには、QRegularExpression::UseUnicodePropertiesOption patternオプションを使います。
ワイルドカード・マッチング
QRegularExpression でワイルドカード・マッチングを行う直接的な方法はありません。 しかし、QRegularExpression::wildcardToRegularExpression() メソッドが用意されており、グロブ・パターンを 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() の効果をエミュレートするのに便利です。有効にすると、量化子の欲張り度が反転します(欲張りなものは怠け者になり、その逆も同様です)。
キャレットモード
QRegExp::CaretAtOffset の動作をエミュレートするにはQRegularExpression::AnchorAtOffsetMatchOption match オプションを使用します。他の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 RegExp がWildcard の場合、ワイルドカード表記でパターンを指定しなければならない。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
正規表現パターンが無効な理由を説明するテキスト文字列を返します。
isValid()も参照 。
[static]
QString QRegExp::escape(const QString &str)
すべての正規表現特殊文字をバックスラッシュでエスケープした文字列str を返す。特殊文字は $, (,), *, +, ., ?, [, ,], ^, {, | および } です。
例
この関数は、正規表現パターンを動的に構築するのに便利です:
setPatternSyntax()も参照のこと 。
bool QRegExp::exactMatch(const QString &str) const
str がこの正規表現に完全にマッチする場合はtrue
を返し、マッチしない場合はfalse
を返します。文字列のどの部分がマッチしたかは、matchedLength() を呼び出すことで調べることができる。
与えられた正規表現文字列Rの場合、extactMatch("R")はindexIn("^R$") と等価である。なぜなら、extactMatch() は正規表現を文字列の開始アンカーと文字列の終了アンカーで効果的に囲むが、matchedLength() の設定は異なるからである。
例えば、正規表現が青の場合、 exactMatch() は入力blue
に対してのみtrue
を返す。入力bluebell
、blutak
、lightblue
に対しては、 exactMatch() はfalse
を返し、matchedLength() はそれぞれ 4、3、0 を返す。
定数ではあるが、この関数は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
offset (デフォルトでは 0) の位置からstr にマッチするものを見つけようとする。offset が -1 の場合、検索は最後の文字から開始され、-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 4
定数ですが、この関数は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
offset の位置からstr をさかのぼって一致する項目を見つけようとします。offset が -1 (デフォルト) の場合、検索は最後の文字から始まり、-2 の場合、最後から次の文字から始まる。
最初にマッチした文字の位置を返し、マッチしなかった場合は -1 を返します。
caretMode パラメータを使うと、^ がインデックス 0 でマッチするか、offset でマッチするかを指定できる。
定数ではあるが、この関数は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)
例えば、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 を含む正規表現の場合、after に出現する ˶1 ,˶2,... は、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 が偽の場合、マッチングは greedy (最大) となり、これがデフォルトとなる。
例えば、入力文字列 "We must be <b>bold</b>, very <b>bold</b>!"とパターン<b>.*</b>があるとする。デフォルトの貪欲(最大)マッチングでは、マッチは "We must be<b>bold</b>, very <b>bold</b>!"となる。しかし、最小(非貪欲)マッチングでは、最初のマッチはこうなる:"我々は<b>太字</b>でなければならない、非常に<b>太字</b>でなければならない!"となり、2番目のマッチは "我々は<b>太字</b>でなければならない、非常に<b>太字</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 を含む単一要素のリストを返す。
behavior をQt::KeepEmptyParts に設定すると、空のフィールドもリストに含まれる。
QStringList::join() およびQString::split()も参照 。
[noexcept]
void QRegExp::swap(QRegExp &other)
正規表現other をこの正規表現と入れ替えます。この操作は非常に高速で、失敗することはありません。
QVariant QRegExp::operator QVariant() const
正規表現をQVariant
bool QRegExp::operator!=(const QRegExp &rx) const
この正規表現がrx と等しくない場合はtrue
を返し、等しくない場合はfalse
を返します。
operator==()も参照のこと 。
[noexcept]
QRegExp &QRegExp::operator=(QRegExp &&other)
Move-このQRegExp インスタンスにother を割り当てます。
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 データ型のシリアライズ」も参照して ください。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。