1

私はCでregexec()関数を使用しています。基本的に、置換のために文字列の一部をキャプチャする正規表現を作成しようとしています。

たとえば、文字列「Hello $ X」がある場合、regexecで範囲6,7を指定して「$X」にします。ただし、任意の数の置換が存在する可能性があるため、正規表現を使用しています。

"([^$]*(\\$[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番目の部分式の最初の完全な部分一致です。しかし、この時点から私は困惑しています。最初の部分式ではなく、2番目の部分式の最初の部分一致のみを返すのはなぜですか?

繰り返し表現していることと関係があるのではないかと思いますが、問題を解決するために何をすればいいのかわかりません。目的のオフセットを返すにはどうすればよいですか?

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

4

1 に答える 1

2

あなたは最初と2番目の意味について混乱しています。この式では:

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

は最初の括弧で囲まれた部分式であり、

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

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

+正規表現の最後でを使用するのではなく、任意の数のインスタンスを一致させたい場合は、単にregexec複数回呼び出し、前の実行の終了オフセットを新しい開始点として使用する必要があります。

于 2012-05-02T19:27:43.760 に答える