私は、ファイルを読んでいるを返し、内容は以下の通りではありません。のTcl正規表現は、すべての一致
Aug2017:
--------------------------------------
Name Age Phone
--------------------------------------
Jack 25 128736372
Peter 26 987840392
--------------------------------------
Sep2017:
--------------------------------------
Name Age Phone
--------------------------------------
Jared 21 874892032
Eric 24 847938427
--------------------------------------
だから私はすべての破線の間で情報を抽出し、リストに入れたかったです。私は情報を抽出するために、以下のTcl正規表現を使用しています$data
は、ファイルの内容を含むと仮定すると、:
regexp -all -inline -- {\s+\-{2,}\s+(.*?)\s+\-{2,}\s+} $data
私が知っているように、返されたマッチした結果がfullMatch
とsubMatch
を含むリストとして保存されます。
llength
コマンドでダブルチェックした場合、fullMatch
とsubMatch
の2つしかありません。
llength $data
2
なぜ1つしかありませんsubMatch
?以下のような5つの試合があるように思わ:
Aug2017:
--------------------------------------
Name Age Phone --> 1st Match
--------------------------------------
Jack 25 128736372
Peter 26 987840392 --> 2nd Match
--------------------------------------
Sep2017: --> 3rd Match
--------------------------------------
Name Age Phone --> 4th Match
--------------------------------------
Jared 21 874892032
Eric 24 847938427 --> 5th Match
--------------------------------------
したがって、この場合には、私はlindex
で2番目のリスト要素(subMatch
)を選択しています。私が得た結果は、このようなものですが、それはコンテンツの先頭と末尾からマッチングされるよう
lindex [regexp -all -inline -- {\s+\-{2,}\s+(.*?)\s+\-{2,}\s+} $data] 1
は、思わ:
Name Age Phone
--------------------------------------
Jack 25 128736372
Peter 26 987840392
--------------------------------------
Sep2017:
--------------------------------------
Name Age Phone
--------------------------------------
Jared 21 874892032
Eric 24 847938427
私の印象は正規表現を始めと試合順から一致する必要がありました文字列の終わり、なぜtcl正規表現がこのように動作しているのか分かりませんか?何か不足していますか?
**ここで達成したいのは、破線の区切り記号の間にデータを抽出することです。上のデータは単なる例です。
期待される結果:すべての一致
{ {Name Age Phone} -->1st match
{Jack 25 128736372
Peter 26 987840392} -->2nd match
{Sep2017:} -->3rd match
{Name Age Phone} -->4th match
{Jared 21 874892032
Eric 24 847938427} -->5th match
}
にUPDATE含むリスト: を私は少し@glennで先読みし、提案を含めて、以下のように私のTCLの正規表現を変更しました:
regexp -all -inline -expanded -- {\s+?-{2,}\s+?(.*?)(?=\s+?-{2,}\s+?)} $data
私が得た結果(10のサブマッチ):
{ {----------------------
Name Age Phone} -->1st match
{Name Age Phone} -->2nd match
{----------------------
Jack 25 128736372
Peter 26 987840392} -->3rd match
{Jack 25 128736372
Peter 26 987840392} -->4th match
{----------------------
Sep2017:} -->5th match
{Sep2017:} -->6th match
...
...
}
予想される結果にかなり近いですが、予想される5つのサブマッチに完全に一致するように正規表現を使用する方法を理解したいと思います。
Tclの正規表現は、Perlののとは異なり、どちらか完全に貪欲ですか完全に非貪欲で、その選択は**最初の**の量指定子によって行われます見た。 're_syntax'のmanページの[Matching]セクション(https://tcl.tk/man/tcl8.6/TclCmd/re_syntax.htm#M95)を慎重に読む必要があります。先頭の '\ s +'は、正規表現全体の欲張りの好みを設定しています。それを '\ s + 'に変更すれば?'あなたは望みの結果に近づきますが、奇数番号のサブマッチだけになります。これは、正規表現が2行目のハイフンを消費しているため、次の行には1行目のハイフンがなくなるためです。 –
私が提供したドキュメンテーション・リンクのキー・センテンスは、「枝は、その中の最初の数量化されたアトムと同じ優先度を持ちます。 –
@glennjackman:あなたの提案をありがとう。結果は期待されたものにかなり近いですが、私はまだ完全に5つのサブマッチでマッチさせる方法を理解したいと思います。更新された結果は、「更新」セクションに表示されます。 –