2016-05-20 12 views
1

コンテキスト、geditでの構文ハイライト大規模なマッチ内のグループを繰り返しキャプチャする正規表現ですか?

問題:特定の領域内のすべての出現をキャプチャしたい。玩具例:

私は keyword1((text))以内(ハイライト)アル$ 0-9(一桁)の発生を、キャプチャしたい
other text here $5 
keyword1 -> ((ran$3dom$6t:,ext$9 )) 
keyword1 -> (( ran$2dom$4t:,ext$6)) 
other text here $7 

。 (ここでは$3$6$9$2$4$6しかしませ$5$7)。これは次のようなものです:より大きな試合の中でグループを繰り返しキャプチャするにはどうすればいいですか?グループはで発生する可能性がある場所

は、私はすべてのテキストをつかむことができます。(?<=keyword1)|\(\(.*\)\)

<context id="keyword1" style-ref="argument"> 
    <match>(?<=keyword1)|\(\(.*\)\)</match> 
</context> 

私はこの関連の質問を発見した(geditのは、デフォルトでは、\ Gを使用しています):How can I write a regex to repeatedly capture group within a larger match?が、その答えはルック内の無限の反復を使用していますその後ろは残念ながらgeditでサポートされていません(私が知る限り)。なにか提案を?あなただけのキーワードで始まる行に取り組んでいることを確認するには

+0

geditがPCREをサポートしている場合は、\ Gベースの正規表現を使用できます。 –

答えて

1

説明

、その後、私は2つのステップ動作としてこれを参照してください。

  1. あなたは
  2. は、この正規表現はkeyword1 -> ((...))

    keyword1\s*->\s*\(\(.*\)\) 
    

    Regular expression visualizationに似た行をキャプチャ$[0-9]ストリング

ステップ1

を抽出興味を持っているラインのそれぞれを収集します

ステップ2

\$[0-9](?![0-9])(?=(?:(?!\(\().)*\)\)) 

Regular expression visualization

この正規表現は、次の操作を行います:

  • ((...))
内部に存在する単一の数字が続くすべてのドル記号を見つけます

ライブデモ

https://regex101.com/r/wY3jM6/1

サンプルテキスト

other text here $5 
keyword1 -> ((ran$3dom$6t:,ext$9 )) 
keyword1 -> (( ran$2dom$4t:,ext$6)) 
other text here $7 

サンプル

$3 
$6 
$9 
$2 
$4 
$6 
にマッチします

説明

NODE      EXPLANATION 
---------------------------------------------------------------------- 
    \$      '$' 
---------------------------------------------------------------------- 
    [0-9]     any character of: '0' to '9' 
---------------------------------------------------------------------- 
    (?!      look ahead to see if there is not: 
---------------------------------------------------------------------- 
    [0-9]     any character of: '0' to '9' 
---------------------------------------------------------------------- 
)      end of look-ahead 
---------------------------------------------------------------------- 
    (?=      look ahead to see if there is: 
---------------------------------------------------------------------- 
    (?:      group, but do not capture (0 or more 
          times (matching the most amount 
          possible)): 
---------------------------------------------------------------------- 
     (?!      look ahead to see if there is not: 
---------------------------------------------------------------------- 
     \(      '(' 
---------------------------------------------------------------------- 
     \(      '(' 
---------------------------------------------------------------------- 
    )      end of look-ahead 
---------------------------------------------------------------------- 
     .      any character 
---------------------------------------------------------------------- 
    )*      end of grouping 
---------------------------------------------------------------------- 
    \)      ')' 
---------------------------------------------------------------------- 
    \)      ')' 
---------------------------------------------------------------------- 
)      end of look-ahead 
---------------------------------------------------------------------- 
+0

あなたの(よく説明された)応答をお寄せいただきありがとうございます。正規表現は本当に必要なすべての$ [0-9]オカレンスをキャプチャしますが、 'keyword1'は考慮していません。 2番目のkeyword1をkeyword2に置き換えると、提案された正規表現は失敗します($ 2、$ 4、$ 6を取り込むべきではありません)。残念ながら私のトリックは| (オープンポスト正規表現を参照してください)あなたの正規表現で動作しません。 – iami

関連する問題