2009-09-17 5 views
2

、拡張正規表現にマッチするのregcompとregexecはCの関数を使用して "(()| ABC)XYZ"、私が見つけます文字列 "abcxyz"に一致しますが、オフセット3からオフセット6までです。私の期待は、文字列全体が一致し、文字列の最初の "abc"部分のサブダッチが表示されることです。期待される動作:(()| ABC)XYZ私のOS X 10.5.8マシンで

私は、同じマシン上のawkと同じパターンとテキストをしようとすると、私は期待するとして、それは文字列全体の一致を示しています。

私は限られた正規表現の使用経験が問題になると思います。誰かが何が起こっているか説明できますか?私の正規表現は有効ですか?もしそうなら、なぜそれは文字列全体と一致しませんか?

「((abc){0,1})xyz」は代替として使用できますが、別のパターン形式から自動的に生成され、「()」のインスタンスを削除することは余分です私は可能な限り回避したいと思います。

私がregcompに渡しているフラグは、REG_EXTENDEDのみで構成されています。私はregexecにフラグ(0)の空のセットを渡します。あなたはすべての一致を反復処理し、両方を取得[3,6)と[0,6)していない場合は

+1

「(abc |())xyz」を試してみることができますか? – Artelius

+2

'(abc)? 'を使用すると動作し、使用した時間よりも短くなります。 –

+0

これは本当にUBかバグかに関心がありません。 '((c)| abc)xyz'を試して、それがどの範囲に一致するか見てみることができますか?私はジョナサンが今回は正しかったと思うが、OSXで学んだことは、実装がバグである可能性を最初に考えることが賢明だ... –

答えて

2

POSIX標準は言う:

9.4.3 ERE特殊文字は

ERE特殊文字は、特定のコンテキストでの特殊な性質を持っています。これらの文脈の外で、または先に<backslash>が付いている場合、そのような文字は、特殊文字自体に一致するEREでなければなりません。次のように彼らは特別な意味を持つものとした拡張正規表現の特殊文字とコンテキストは、次のとおりです。

.[\(

<period><left-square-bracket><backslash>、および<left-parenthesis>ブラケット式の中で使用された場合を除き、特別なものでなければなりません( REブラケット式を参照)。ブラケット式の外では、<left-parenthesis>の直後に<right-parenthesis>が続き、未定義の結果が生成されます。

あなたが見ているのは、未定義の動作を呼び出した結果です。何かが行きます。

信頼性の高いポータブルな結果が必要な場合は、空の '()'という表記を削除する必要があります。

+0

ええ、私は最良の選択は '()'の使用を避けることだと思います。私のシステムでは、 're_format(7)'のマニュアルページに示した動作を定義していますが、行うべきことはPOSIXに固執しています。参照を掘り下げてくれてありがとう。 – Eric

0

、その後、バグがあります。 posixが一致が返される順序までは何を要求しているのかよく分かりません。

+0

すべての試合を反復すると[3,6]、[3,3]、および[3,3]。最初のものは、regexecのmanページに従って、正規表現全体にマッチします。 – Eric

0

試してみてください(abc|())xyz - 両方の場所で同じ結果が得られると思います。私はCバージョンができる限りどこでもxyzとマッチしようとしているとしか思えません。それが失敗した場合はどこでもabcxyzとマッチしようとします(ただし、見ている通り、失敗しないので、 abc "の部分)、awkは、それがあなたの期待どおりに実行する独自の正規表現エンジンを使用している必要があります。

あなたの正規表現は有効です。私は問題がa)正規表現がどのように動作するかについてPOSIXがあまり明確ではない、あるいはb)awkが100%POSIX準拠のregexを使用していないことを考えていると思います(おそらく、OS Xはawk )。どんな問題でも、それは多分縁辺のケースであり、ほとんどの人がそのように正規表現を書いていないので、恐らく原因が考えられます。

+0

興味深いアイデア!私は "(abc |())xyz"を使って試してみました。正規表現全体に対して[0,6]を返し、サブマウントに対しては[0,3]を返します。 標準を理解しているので、常にすべての候補者の中で最も長い試合を使用する必要があります。だからあなたが何が起こっているのかが分かっていれば、それはバグだと思う。 – Eric

+0

これはバグのようですね。私ができることは、glibcの実装を覗いていない限り、説明しようとすることです。予期せぬ出力に基づいてそこで何が起こっているかがわかっていると感じているからです。おそらく、あなたはglibcの著者にバグレポートを提出するべきです(あるいは、GCCを使って別のコンピュータでテストして、それがApple単体の/ glibcのみの古い問題の古いバージョンかもしれないかどうかを確認してください)。 –

+0

これはバグではありません。行動は未定義のやり方で行動する。 –

関連する問題