West Indian batsman Evin Lewis hit his maiden one-day international hundred but his efforts went in vain as Sri Lanka held their nerve to secure a one-run victory at Queens Sports Club on Wednesday and advance to the triangular series final.
Playing just his fourth ODI, Lewis struck a superb 148 but a series of run-outs ultimately hurt the West Indies as they finished on 329 for nine in response to Sri Lanka's 330 for seven.
Sri Lanka's total was set up by Niroshan Dickwella and Kusal Mendis, who both scored 94 after the West Indies had won the toss and opted to bowl first.
The victory ensured Sri Lanka's passage to Sunday's final, while the West Indies must avoid defeat in their final group game against hosts Zimbabwe on Friday if they are to progress.
SCORES IN BRIEF
SRI LANKA: 330 for 7 (Dickwella 94, Mendis 94, de Silva 58; Holder 3-57)
WEST INDIES: 329 for 9 (Lewis 148, Holder 45 not out; Kulasekara 2-73, Lakmal 2-67)
Result: SL won by one run