Вы можете попробовать регулярные выражения , например:
using System.Text.RegularExpressions;
...
var match = Regex.Match(
source,
@"(?<street>[A-Z][A-Za-z'\s]*)(?<number>[0-9]+)\s*(?<letter>[a-zA-Z]*)");
if (match.Success) {
// "Mushroom Road"
var addressStreet = match.Groups["street"].Value.Trim();
// "2"
var addressNumber = match.Groups["number"].Value;
// "b"
var addressLetter = match.Groups["letter"].Value;
...
}
Pattern (?<street>[A-Z][A-Za-z'\s]*)(?<number>[0-9]+)\s*(?<letter>[a-zA-Z]*)
означает
(?<street>[A-Z][A-Za-z'\s]*) one capital letter A..Z followed by
zero or more letters (a..z A..Z),
apostrophes and whitespaces
(?<number>[0-9]+) one or more digits
\s* zero or more whitespaces
(?<letter>[a-zA-Z]*) zero or more letters a..z A..Z
Демонстрация:
string[] tests = new string[] {
"Mushroom road 2b",
"Mushroom road 2 b",
"Mushroom 2"
};
var results = tests
.Select(test => new {
test,
match = Regex.Match(
test,
@"(?<street>[A-Z][A-Za-z'\s]*)(?<number>[0-9]+)\s*(?<letter>[a-zA-Z]*)")
})
.Select(item => new {
test = item.test,
street = item.match.Groups["street"].Value.Trim(),
number = item.match.Groups["number"].Value,
letter = item.match.Groups["letter"].Value
})
.Select(item =>
$"{item.test,-20} => \"{item.street}\"; \"{item.number}\"; \"{item.letter}\"");
string report = string.Join(Environment.NewLine, results);
Console.Write(report);
Результат:
Mushroom road 2b => "Mushroom road"; "2"; "b"
Mushroom road 2 b => "Mushroom road"; "2"; "b"
Mushroom 2 => "Mushroom"; "2"; ""