2012-05-02 1 views
1

私はCでregexec()関数を使用しています。私は基本的に正規表現を書いて文字列の一部を取り込みます。POSIX C regexec()ですべての繰り返し一致のオフセットを取得するには?

たとえば、 "Hello $ X"という文字列がある場合、 "$ X"というようにregexecで範囲6,7を指定します。置換の任意の数が存在することができるようしかし、私は正規表現を使用しています:

"([^$]*(\\$[A-Za-z][A-Za-z0-9_]*))+" 

は、これは、テキスト+置換パターンの任意のシーケンスと一致する必要があります。

例えば "First = $ X、Second = $ Y"という文字列の場合、$ Xはオフセット6-7で発生し、$ Yはオフセット17-18で発生したことを知る必要があります。私はregexecはから入手

実際のオフセットは、以下のとおりです。 0,19 8,19 17,19

まず、私は終了オフセットが実際に試合の文字過去1であることを理解しています。したがって、上記のオフセットは、文字列の以下の部分に対応しています。

First=$X, Second=$Y 
, Second=$Y 
$Y 

今、私はここで何が起こっているかを見ることができます:最初の範囲は明らかに全体の試合であり、第二は、最初の全体サブ試合です2番目の部分式。しかし、この点から私は困惑しています。なぜ、最初のサブ式ではなく、2番目のサブ式の最初の部分一致のみを返しますか?

私は繰り返し表現があるという事実とは関係がありますが、問題を解決するために何をする必要があるのか​​分かりません。どのようにして希望のオフセットを返すのですか?

注:128要素のregmatch_tをregexec()(nmatch = 128)に渡していますので、すべての一致を取得できるはずです。

答えて

2

あなたは最初と2番目の平均を混同しています。この式では:

"([^$]*(\\$[A-Za-z][A-Za-z0-9_]*))+" 
^_______________________________^ this part 

は、第parenthesizesの部分式と

"([^$]*(\\$[A-Za-z][A-Za-z0-9_]*))+" 
     ^________________________^ this part 

が第二です。括弧で囲まれた部分式が、*?+、または{}繰り返し演算子の一部として複数回使用される場合は、最後に一致する部分一致です。

正規表現の末尾に+を使用するよりも、任意の数のインスタンスに一致させる場合は、regexecを複数回呼び出して、前回の実行の終了オフセットを新しい開始として使用するだけですポイント。

関連する問題