正規表現でネストされた一致するグループ


8

次の方法でpython式を変換するときの一般的な使用例があります。

value 1
value 2
value 3

['value 1', 'value 2', 'value 3']

最も簡単な方法はマッピングを使用することですが、このタスクの代わりに使用したかったのです。

これまでのところ私は得ました:

s/\(.*\n\)\+/[&]/g

その結果

[value 1
value 2
value 3
]

この昇給私が一致することができるようにしたいので、質問、\(.*\)ではなく\n、使用する内部のマッチの結果'...'

これを行う方法を知っていますか?


2
私は、単一置換でどのように行うのか分からないが、あなたは(Pythonの式を選択した後)、ビジュアルモードで2しばらくそれを行うことができます::'<,'>s/\v(.*)\n/'\1', / | s/\v(.*), /[\1]/あなたは視覚的なマッピングにこれを変換することもできますxnoremap ,x :s/\v(.*)\n/'\1', / <Bar> s/\v(.*), /[\1]/<CR>し、多分あれば、通常のマッピングに式は段落内にあります:nnoremap ,x :'{+1,'}-1s/\v(.*)\n/'\1', / <Bar> s/\v(.*), /[\1]/<CR>ここでのマッピングはになります,x
user9433424 2016年

1
正規表現では実行できませんでしたが、外部コマンドを使用しています:%! echo "[$(sed "s/.*/'&',/" % | tr '\n' ' ' | sed 's/, $//')]"
Sundeep

回答:


5

編集する

「sub-replace-expression」を使用すると、1つの式でこれを行うことができます。それに関する情報については下を見てください。

/編集

ここでの問題は、2つの異なることを実行したいということです。

  1. 試合全体を操作する(つまり、で囲む[]

  2. マッチ内の各アイテムを操作します(つまり、それらをで囲みます'',)。

あなたはどちらかを簡単に行うことができます:

  1. :s/\(.\+\n\)\+/[&]/
  2. :%s/\(.\+\)\n/'\1', /

しかし、私が知る限り、1回の操作で両方を行う方法はありません。私は次のようなもので適切な出力を得ようとしました:

:s/\(\(.\+\)\n\)\+/[\2]/

しかし、もちろん、これの問題は\2、2番目のメモリの括弧のセットの最後の一致のみに一致し、\(\)その前には何も「覚えていない」ことです。つまり、最後の行だけで終わります。

:s///事実の前後の改行を取り除くために、追加のコマンドでいくつかの前後処理を行うことをお勧めします。これが私が思いついたものです

function! FormatExpression()
   .,/\n^$/s/\(.*\)\n/'\1', /
   s/\(.*\), /[\1]/
endfunction

1行目(改行を削除)

  • .,/\n^$/これは、検索と置換の範囲修飾子です。これがないと、コマンドはファイル全体を破壊します。現在、現在の行から.次の空白行に移動し\n^$ます。どのように分割しようとしていたのかはわかりませんが、停止するように指示する方法が必要です。
  • s/ 検索と置換コマンドの始まり
  • \(.*\)\n 行全体に一致しますが、改行なしで一部のみを保存します。
  • '\1', 行を一重引用符で囲まれた一致に置き換え、カンマを追加します。

2行目(括弧で囲む)

  • \(.*\), 行全体と一致しますが、最後のコンマとスペースは一致しません
  • [\1] ブラケットで囲み、余分な終了カンマとスペースも削除します。

これからも調べていきますが、今のところ、1つの表現では実現できないと思います。:(

編集:

これを1つの式で行う方法を見つけました!内部的にはこれは実際には2個の置換であるが、それはある技術的に一つの式。これが私が思いついたものです:

:s/\v((.+\n)*.+)\n/\= "['" . substitute(submatch(1), '\n', "', '", 'g') . "']" /
  • :s///:置換する
  • \v((.+\n)*.+)\n:基本的に、次の空白以外の行をすべてまとめ、最終行を除いてすべて保存します \n
  • \=置換で式を使用できます(を参照:h sub-replace-expression
  • substitute(submatch(1)...):格納され\nているすべてを', '
  • "['" . ... . "']":プリペンド['とアペンド']

これはカーソルの位置から始まり、空白行(^\n)が見つかるまで続きます。最後の部分\nを取得しないことが重要です。そのビットがないと、最後に不要な追加部分が残ってしまうからです',

これは、前の2つの式の答えよりも複雑だと考える人もいます。しかし、実際には1つの式で実行できるため、これを追加して追加すると思いました。:)


2

次に、視覚的に強調表示します。

:'<,'> s/.*/['&']/ | *j! | s/]\[/, /ge

これは、例えば作るために、各ラインを囲んで['value 1']、その後、すべてのそれらを結合し、隣接置き換える][カンマスペースで。

ちなみに*in のドキュメントはに*j!あり:help cpo-starます。それを見つけるのは少し難しいです。


:)
nobe4

実際には:'<,'>s/\v(.*)(\_.)/['\1']/、結合を使用して削除できます。
nobe4 2016

ええ、でもファイナルを食べます、それが\n私が使っ:joinた理由です。私はおそらくそれを述べるべきだったでしょう。:-)
アントニー

1
ではどう'<,'>s/.*/['&']/ | *s/]\_.\[/, /ですか?
nobe4 2016

1
ええ、それは良いです。私はおそらく第2部をと書くでしょうが*s/]\n\[/, /e
アントニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.