2016-10-20 2 views
1

私はいくつかの(複数の)スペースで区切られたフロートを持つファイルを持っています。浮動小数点数はさまざまです。いくつかのスペースを追加し、再びそれをグループ化し、私はグループにこれを立ち往生複数の山車をキャッチするネストされたグループが正規表現マッチ(TCL)を台無しにしないようにします。

www.regular-expressions.info/floatingpoint.html

[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)? 

:引数のためにのは、それは私がこのチュートリアルのページから正規表現を拾っ5だとしましょうと?定量器。

(([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s+)+ 

私はネストされたグループを作成しており、それが私の知識が終わるところです。正規表現をテストすると、サブグループ、つまり指数の望ましくない一致が得られます。

私の質問は次のとおりです。私はフルフロートである「第1レベル」のグループだけをキャプチャするにはどうすればよいですか?

サンプルテストデータセット(スペースのノート様々な数):

set x " 1.0034e-09 -0.34e+07 -3 0.46 3.445e+03 " 

おかげで、 ゲルト

答えて

2

あなたの式は、ネストされたキャプチャグループは、あなたがアクセスできるようになるという意味ではありませんが含まれているという事実これらの繰り返しのキャプチャは、アクセス可能な唯一のものは最後の反復中にキャプチャされたテキストになります。

また、各キャプチャグループはTclで返され、必要でない場合はすべてのキャプチャグループを非キャプチャ(([eE][-+]?[0-9]+)?) =>(?:[eE][-+]?[0-9]+)?)に変換します。あなたのテストセット内のすべての番号と一致するには

、あなたは[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?正規表現は整数 OR フロート値と一致していることをIDEONE demo

NOTEを参照してください

set x { 1.0034e-09 -0.34e+07 -3 0.46 3.445e+03 } 
set RE {[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?} 
set res [regexp -all -inline $RE $x] 
puts $res 

を使用することができます。 と一致するのはです。[-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)?を使用してください(\.の後に、の0または0の出現を-?のように削除してください)。

関連する問題