2016-05-23 12 views
1

テキストがあります。テキストは、<null>または最後にparantheseのいずれかでフォローされています。私は(..または/冒頭で)パターン1とパターン2をキャプチャしたい:先読み後のテキストのキャプチャ

pattern1 <null> (not important) 
pattern1 ../pattern2 (not important) 
pattern1 /pattern2 (not important) 

私は入力

(.+)(?=(<null>|(\.\.| \/)))(.+)(.*)(?= \() 
私はPATTERN2を得る2番目と3番目のキャプチャグループを連結ではなく

ことを期待しました: pthread_create /usr/include/c++/5/thread:115 (library) 結果:

pthread_create 
/
/

はこれに対する解決策はありますか?

+1

['(。+?)( |(?* \。\/| \ /))(?* \()'](https:// regex101。 –

+0

@Wiktor:ありがとう、それはうまくいくわたしの表情に何が間違っているのかを説明することができますか?それはあなたの解決策ですか? – robert

+0

これは先読ではなく、キャプチャしていないグループです –

答えて

1

正規表現では、\.\.は2つのドットと一致しますが、その後は/をキャプチャしません。したがって、lands in Group 4です。また、結果に不必要なグループが作成されるため、キャプチャグループ内で肯定的な先読みを維持することには意味がありません。(<null>|(\.\.| \/))を消費パターン部分に移動することができます。など、いくつかのように、改行以外の1つの以上の任意の文字を(グループ1) -

  • (.+?)

    あなたはパターンが一致regex demo

    を参照してください

    (.+?)(<null>| (?:\.\.\/|\/))(.*?)(?= \() 
    

    使用することができます最初の発生まで可能...

  • (<null>| (?:\.\.\/|\/)) - (グループ2)<null>又は空間は../又は/
  • (.*?)(?= \()と続く - (グループ3)は、ゼロ以上の任意の文字が、スペースの最初の発生までできるだけ少ないような改行が(と続きます。
関連する問題