Получить номер после пробела из строки - PullRequest
1 голос
/ 10 июля 2019

Я пытаюсь разобрать адрес, чтобы я мог получить адрес, номер адреса и адресное письмо.

string address = "Mushroom road 2b";

Я пытаюсь получить

var addressName = "Mushroom Road";
var addressNumber = "2";
var addressLetter = "b";

I 'мы попытались использовать split и проанализировать ее с помощью подстроки.

   string adress = "Mushroom road 2b";
   string temp = adress;

   var res = temp.Substring(temp.IndexOf(' '));
   //check if res first letter = number?
   //Not sure how to use regex really
   var addressNumber = Regex.Replace(temp, @"[^\d]", "");

res будет дорога 2b.Но я хочу вернуть сначала Грибную дорогу, потом 2, потом б.

Ответы [ 2 ]

3 голосов
/ 10 июля 2019

Вы можете попробовать регулярные выражения , например:

  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"; "" 
0 голосов
/ 10 июля 2019

Метод Split мог бы нам пригодиться.

var parts = address.Split(' ');
addressName = parts[0];
addressNumber = parts[1];
addressLetter = parts[2];

или используйте регулярные выражения с группами.

неправильно.

Теперь вы можете использовать, например, parts [2] и используйте .Substring.

Вы можете итерировать все символы также и проверять их. Класс Char имеет несколько полезных методов.

...