Qt 4.6 を使用してプログラムを作成しています。B1、B3 などの式から非範囲リテラルの出現をすべてキャプチャする必要があります
"SUM(A1:A3)+B1-B3+SUM(D1:D3)/COUNT(D1:D3)"
が、A1、A3、D1、D3 はキャプチャしません。QRegExp を使用しようとしましたが、否定的な後読みアサーションをサポートしていないため、A3、D3 などのリテラルを除外できません。私の正規表現(?<!:)([A-Z]{1,4}[1-9]\\d{0,3})(?!:)
は機能しません。あなたの意見が必要です。ありがとう。
3 に答える
あなたの場合、使用できます
(?:^|[^:])\b([AZ]{1,4}[1-9]\d{0,3})\b(?!:)
最初のグループは、先頭の空の文字列またはコロン以外の任意の文字に一致します。パターンが のようなものと一致しないように、単語の境界 も追加しました。\b
A4a
多くの場合、「ポジティブな」パターンを書く方が簡単です。たとえば、
(...)(:...)?
セル参照に一致するパターンを...
示す[A-Z]
ことで、1 つのパスで範囲と非範囲を一致させ、結果をループするときにすべての範囲を破棄できます。2 番目のキャプチャ グループが空かどうかを確認することで、一致が範囲であるかどうかを簡単に検出できます。
Qt 5.0のQRegularExpressionは、(固定長の)ルックビハインドアサーションをサポートします。
https://bugreports.qt-project.org/browse/QTBUG-2371は2012年3月22日に閉鎖されました。Qt5.0は2012年12月19日にリリースされました。
ルックアラウンドをサポートしていないエンジンでルックアラウンドを必要とするソリューションについては、「コンビナトリック ブルート フォーシング」と呼んでいる代替手段が 1 つしか見つかりませんでしたが、より技術的な名前があると確信しています。1 つの例を次に示します: Validate proxy URL using XML regex pattern。
ただし、複数のオカレンスを検索する必要がある場合は機能しません。あなたはおそらくこのようなことを自分で試したことがあるでしょう:
/[^:]\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:]/
(より安全にするために を追加しました\b
。また、バックスラッシュを再度エスケープすることを忘れないでください。)
これを実際に試してみると、次の問題に+B1-
気付くでしょう。そのため、-
は既に読み取られているため、次のセル参照B3
は一致しません。これは、 に適切な文字がないため[^:]
です。
問題を再説明するために、上記の正規表現は、セル参照の連続チェーン内の他のすべての一致のみをキャッチできます。たとえば、文字列については、
(A1+A2+A3+A4+A5+A6)/(B1+B2+B3+B4+B5+B6)
^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^
...指定されたパーツのみが一致し、ここにも表示されます。
単一の正規表現でこれを回避する方法はありません。あなたの選択肢:
正規表現以外の方法を使用してください。
何らかの理由で正規表現を使用する必要がある場合、おそらく唯一の希望は、少なくとも2 つの正規表現を使用できるようにすることです(たとえば、最初の正規表現を使用して、すべてのセル参照のような文字列の周りにスペースを挿入し、セルの連続したチェーンがないようにします)。参照)。
または、それらをサブマッチにキャプチャするのに十分である可能性が低い場合、つまり 、 などを介してアクセスできる
.cap(1)
場合.cap(2)
は、次のことができる場合があります。
/[^:]\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:](?:(\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:](?:(\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:](?:(\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:](?:(\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:](?:(\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:](?:(\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:]))?))?))?))?))?))?/
これでは読めないので、より読みやすいバージョンを示します。PretendXY
は、セル参照式 に展開されます\b([A-Z]{1,4}[1-9]\d{0,3})\b
。次に、上記は次と同じです。
/[^:]XY[^:](?:(XY[^:](?:(XY[^:](?:(XY[^:](?:(XY[^:](?:(XY[^:]))?))?))?))?))?))?/
パターンが見えますか?先に進む前に、この正規表現が例と完全に一致することがわかります。欠点は、正規表現を定義している限り、連続したセル参照のチェーンしか処理できないことです。上記は 7 を処理でき、それを超えると壊れます。