5

私が書いたら

(?<=\()\w+(?=\))

この文字列の場合: (Test) (Test2) (Test3)

私は得る: テスト Test2 Test3

それは理にかなっている。

私が書いたら

\w+ (?<=\()\w+(?=\))

この文字列の場合: LTE (テスト)

それは何も返しません..ここで何が問題なのですか?

読みにくい可能性があるため、正規表現を明確に説明してください。

4

2 に答える 2

5

ルックアラウンドは文字を消費しません!

これを段階的に確認する方法を次に示します(最善ではないかもしれませんが、とにかくそれが私が解釈する方法です):

最初Lの文字は です。正規表現エンジンはそれを と比較し\w+、一致することに同意します。についても同じことが起こりTますE

スペースで、正規表現エンジンは正規表現にスペースを見つけますが、それも問題ありません。

次は開き括弧ですが、正規表現は何を見ますか? ルックアラウンドは文字を消費しないことに注意してください。そのため、\(in(?<=\()は実際には消費され\(ず、一致するものと\w+一致しません!

\w+ \w+これらの文字を実際に消費する正規表現について考えるかもしれません\w+: 条件は満たされている可能性がありますが、式自体はどの括弧とも一致しません!

一致させるには、括弧を追加する必要があります。

\w+ \((?<=\()\w+(?=\))\)

スペースを確認して一致させた後、正規表現エンジンは(、提供された式と一致する を確認し、先に進みます。

次に、エンジンはT. まず、次の文字と一致し\w+ますか? はい、次に、その前に開き括弧がありますか? はい。

前進する前に、前向きな見通しが見えます。直前に閉じ括弧はありますか?いいえ、ありますがe\w+それでも満足できるのでe、別の と一致し\wます。これは まで続きtます。の後に閉じ括弧はありtますか? はい、次のチェックに進みます。

式の閉じ括弧と一致する閉じ括弧に遭遇します (リテラルの閉じ括弧はここで削除でき、LTE (Test代わりに一致することに注意してください)。

しかし、これらすべてを考えると、ルックアラウンドをやめた方が良いかもしれません:

\w+ \(\w+\)

エンジンへの負担が増えるため、小さなスケールではそれほど目に見えませんが、より大きなストリングでは重要になる可能性があります.

微力ながらでもお役に立てれば幸いです!

于 2013-08-14T17:15:26.757 に答える
2

先読みと後読みは「ゼロ幅アサーション」であり、文字列内の文字を消費せず、一致が可能かどうかのみをアサートします。<word1><space><word2>2 番目のパターンは構造を見つけようとしますが、括弧で囲まれていること期待しています。前に受け入れる唯一の文字は!<word2>であるため、何にも一致しません。パターンに括弧を直接書き込むだけです: . 私はそれを試してみました。<word2><space>(\w+) \((\w+)\)LTETest

于 2013-08-14T17:19:33.183 に答える