1

Vimscriptの文字列内の特定の出現をすべてキャプチャしたいと思います。

例:

let my_calculation = '200/3 + 23 + 100.5/3 -2 + 4*(200/2)'  

'/'の前後のすべての数字(ドットがある場合はそれを含む)をキャプチャするにはどうすればよいですか?2つの異なる変数で:
-出力before_slash:200100.5200-
スラッシュ後の出力332

状態が発生した場合、どうすればそれらを交換できますか?
単一の「/」の後に「。」がない場合はpe。この番号の後に「.0」を追加します

マッチストリングと正規表現を使用しようとしましたが、試した後、解決できませんでした。

4

3 に答える 3

3

この場合に利用できる便利な機能は、式での置換です(を参照:help sub-replace-\=)。

let [a; b] = [[]]
call substitute(s, '\(\d*\.\?\d\+\)/\(\d*\.\?\d\+\)\zs',
\   '\=add(a,submatch(1))[1:0]+add(b,submatch(2))[1:0]', 'g')
于 2012-05-05T10:13:59.027 に答える
2

これを試してみてください:

function! GetNumbers(string)
  let pairs = filter(split(a:string, '[^0-9/.]\+'), 'v:val =~ "/"')
  let den = join(map(copy(pairs), 'matchstr(v:val, ''/\zs\d\+\(\.\d\+\)\?'')'), '')
  let num = join(map(pairs, 'matchstr(v:val, ''\d\+\(\.\d\+\)\?\ze/'')'), '')
  return [num, den]
endfunction
let my_calculation = '200/3 + 23 + 100.5/3 -2 + 4*(200/2)'
let [a,b] = GetNumbers(my_calculation)
echo a
echo b
于 2012-05-05T09:44:12.413 に答える
2

質問の2番目の部分に答えるには:

let my_calculation = '200/3 + 23 + 100.5/3 -2 + 4*(200/2)'
echo substitute(my_calculation, '\(\/[0-9]\+\)\([^0-9.]\|$\)', '\1.0\2', 'g')

上記の出力:

200/3.0 + 23 + 100.5/3.0 -2 + 4*(200/2.0)
于 2012-05-05T09:58:09.683 に答える