2009-05-12 12 views
0

私は(このように見える非常に単純な)テキストを解析する正規表現を書こうとしています。正規表現の接頭辞は、裏返しのアサーションでのみ一致します

some stuff 
First name: John 
Last name: Smith 
more stuff 

私は最初と最後の名前をキャプチャしたいので、私はこのような正規表現を試してみました:

(?<=First name:\s*)(?<FirstName>\w+)(?<=\s*Last name:\s*)(?<LastName>\w+) 

これは、一致を見つけることができません。各パート(名と姓)は個別に動作しますが、一緒には動作しません。また、それが一致していない...次は

(?<=John\s*Last name:\s*)(?<LastName>\w+) 

に動作しますが、私は非一致するグループのうち、「ジョン」を移動したときに...

John(?<=\s*Last name:\s*)(?<LastName>\w+) 

私はここで間違っていますか?それでも

First name:\s*(?<FirstName>\w+)\s*Last name:\s*(?<LastName>\w+) 

、私は興味があると思い、それはルック背後で動作しない理由を知っている:

答えて

1

ルックアサーションアサーションはゼロ幅であるため、FirstNameキャプチャは "First name:"の後にあるもの(この場合は "John")と一致/キャプチャします。この最初のマッチの後、ターゲット文字列の位置は "John"の直後になります。しかし、正規表現の次の部分は別の振る舞いであるため、正規表現は現在の位置の直前にあなたのルックバックテキスト(この場合は "姓")が一致するかどうかを調べます。実際には "John"が先行しているので、正規表現全体が失敗し、 "Smith"に到達することはありません。

0

ただ、次の作品はので、私はおそらく、ルックビハインドを必要としないことに気づき今後の参考のために。

0

私はあなたが使用している正規表現言語で改行が一致することを確認する必要があると思います。

Pythonでは、これはre.DOTALLre.compile()に、またはreを使用していることを意味します。 Perlでは、最後のスラッシュの後にsを追加します。

+0

私はこの回答が古代であることを知っていますが、DOTALL /シングルラインモードは効果がありません。それがするのはドットの意味を変えるだけで、この正規表現にはドットはありません。 –

+0

ネクロマンサー! :D –

関連する問題