2012-05-05 3 views
1

Я хочу захватить все определенные вхождения в строке в Vimscript.Как захватить все вхождения в строке в Vim?

пример:

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

Как я могу захватить все номера (в том числе точек, если есть) до и после «/»? в 2 различных переменных:
- выход before_slash: +200100,5200
- выход после слэш 332

Как я могу заменить их, если возникает условие?
p.e. если после одного «/» нет ». add '.0' после этого числа

Я попытался использовать matchstring и regex, но после попытки и попытки я не смог его решить.

+0

Возможно, это поможет вам: 'my $ str = '200/3 + 23 + 100.5/3 -2 + 4 * (200/2)'; @pair = ($ str = ~ m/(\ d +) \/(\ d +)/g); my $ left = ""; my $ right = ""; while (@pair) { $ left. = Shift @pair; $ right. = Shift @pair; } ' код perl, просто нужно проверить чек. – gaussblurinc

ответ

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) 
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 
+0

Большое спасибо за хорошее решение. – Reman

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') 
+0

Ib, что такое 'a' en 'b'? – Reman

+0

@Remonn: Списки, содержащие захваченные числители и знаменатели, соответственно. –

+0

Очень хорошее регулярное выражение. Я буду помнить его. Он нашел решение Creemama полезным сделать замену, заданную в моем вопросе, но я полагаю, что это будет возможно и с вашим регулярным выражением. – Reman

Смежные вопросы