England 251-7 (50 overs) beat Sri Lanka 95-5 (24 overs) by 49 runs on Duckworth/Lewis rule after play was abandoned due to rain.
Andrew Flintoff's remarkable summer continued as his blistering 104 off 89 balls propelled England to a Champions Trophy semi-final against Australia.
The all-rounder's third one-day international ton steered his side to a healthy 251-7 off their 50 overs.
Flintoff then grabbed two wickets in Sri Lanka's innings after Steve Harmison had reduced them to 15-2.
Sri Lanka were 95-5 after 24 overs in reply when rain ended play, England winning on the Duckworth/Lewis rule.
With 157 more required off the remaining 26 overs at just over six an over, Sri Lanka were not out of it and could count themselves unfortunate at the manner of their exit.
But with Flintoff in such barnstorming form and Harmison at his menacing best, it would have been a surprise if England had not secured victory regardless of the weather.
From a potentially vulnerable 123-4 in the 33rd over, they were once again indebted to Flintoff's awesome power and timing for their competitive total.
After rain had brought a premature end to Friday's proceedings, England resumed at 118-3 with 18 of their 50 overs remaining.
When Marcus Trescothick was brilliantly run out for 66 by Tillekeratne Dilshan off his own bowling in the second over of the day, Sri Lanka sensed their opportunity.
England recovered well from the loss of Trescothick
But with Paul Collingwood joining him, Flintoff, on 21 overnight, batted sensibly to keep the scoreboard ticking over, 46 runs coming off the first 10 overs of the day.
He brought up his 50, off 69 balls, in the 43rd over with a lofted cover drive for four off Sanath Jayasuriya.
But the 26-year-old really turned on the style in the last six overs of the innings, in which England scored 78 runs.
His second 50 came off just 20 balls, with the first of three sixes coming in a pivotal 45th over off Upul Chandana which yielded 22 runs.
Collingwood also scored quickly with 39 from 49 balls, but Flintoff powered on, also hitting nine fours to bring up his century off the second ball of the final over.
The Rose Bowl rose in appreciation of a memorable innings, and were on their feet again after Flintoff perished two balls later attempting another heave at Chaminda Vaas.
There was still time for Alex Wharf to be run out off his first ball, but England had already managed 20 more than they might have envisaged thanks to Flintoff.
Harmison maintained the momentum when he angled one into Avishka Gunawardene in the fourth over of Sri Lanka's innings, Geraint Jones taking the first of his three catches.
Harmison pegged back Sri Lanka
The fast bowler struck again in his next over with a brute of a delivery to dismiss Marvan Atapattu, leaving Sri Lanka 15-2.
Sanath Jayasuriya and Saman Jayantha took the score to 49 before Flintoff worked his magic in his first over, inducing Jayasuriya into a lofted drive that Darren Gough snaffled at mid-off.
England's man of the moment struck again in the 19th over when Jayantha nibbled at a wide one and was caught behind.
And Mahela Jayawardene plunged Sri Lanka into deeper trouble at 88-5, giving Ashley Giles a return catch off a full toss in the spinner's first over.
By that stage the drizzle had started to fall and when it got heavier in the following over, the 24th, umpires Billy Bowden and Darrell Hair took the players off.
Since more than 20 overs of the innings had been bowled, the Duckworth/Lewis rule applied and Sri Lanka were 50 runs short.
England: MP Vaughan (capt), ME Trescothick, VS Solanki, AJ Strauss, A Flintoff, PD Collingwood, GO Jones (wkt), AF Giles, AJ Wharf, D Gough, SJ Harmison.
Sri Lanka: DA Gunawardene, ST Jayasuriya, MS Atapattu (capt), WS Jayantha, KC Sangakkara (wkt), HAPW Jayawardene, TM Dilshan, UDU Chandana, WPUJC Vaas, MF Maharoof, DNT Zoysa.