Bulawayo: 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 pair shared in a 107-run partnership for the third wicket, as Sri Lanka racked up 330 for seven after losing the toss and being put in to bat by the West Indies.
The duo put on 105 for the second wicket before de Silva was caught and bowled by Kraigg Brathwaite for 58.
Dickwella and Mendis capitalised on that platform, keeping the momentum going until West Indies captain Jason Holder broke the stand by trapping Dickwella lbw.
Mendis also fell agonisingly short of a hundred when he edged a delivery from Ashley Nurse through to the wicketkeeper.
Despite those setbacks, Sri Lanka finished strongly as they added 45 runs in the last five overs, with captain Upul Tharanga falling for a brisk 26 off the final ball of the innings.
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.
Sri Lanka - 330 for 7 (Dickwella 94, Mendis 94, de Silva 58, Holder 3-57)
West Indies - 329 for 9 (Lewis 148, Holder 45*)
Result - Sri Lanka won by 1 run