2016-06-07 2 views
0

У меня есть строка с разделенными пробелами адресами, и я хочу отделить номер от названия улицы.Соответствие букв пробелу буквенно-цифровых строк

Так что, если мы имеем:

Street Бла Бла 34

или

34 Street Бла Бла

Я хочу, чтобы регулярное выражение, чтобы соответствовать " Street Blah Blah ", а другой -" 34 "

Он может получить более сложный с адресами, как это:

Überbrückerstraße 24.

, где он должен вернуть "24", а остальное, как на улице или

Järnvägstationg. 3/B

, где он должен вернуть 3/B, а остальное как на улице и т.д.

Я сейчас делаю это с помощью C#, где я разделить все строки пробелом и возврата в зависимости от того строка содержит, по меньшей мере, один номер, а затем вернуть все остальное как улицу.

Однако мне было интересно, было бы более элегантно и эффективнее делать это с помощью Regex.

Я занимаюсь регулярным выражением, но пока не нашел надежного пути. Любые идеи?

Ниже приведены некоторые данные об испытаниях на единицу. Входная улица, ожидаемое число помещения и ожидаемая улица:

[TestCase("Järvägstationg. 3/B", "3/B", "Järvägstationg.")] 
    [TestCase("Überbrückerstraße 24a", "24a", "Überbrückerstraße")] 
    [TestCase("Street Blah Blah 34", "34", "Street Blah Blah")] 
    [TestCase("34 Street Blah Blah", "34", "Street Blah Blah")] 
    [TestCase("Ueckerstr. 20 b", "20 b", "Ueckerstr.")] 
    [TestCase("Elmshornerstraße 163", "163", "Elmshornerstraße")] 
    [TestCase("Hallgartenerstrasse Moritzstr.", "", "Hallgartenerstrasse Moritzstr.")] 
    [TestCase("19 Green Lane", "19", "Green Lane")] 

Я думаю, что из этих

Ueckerstr в. 20 b

является самым сложным, и в этом случае я не возражаю, если в этот раз это не удается.

+1

опечатка Järvägstationg, там должно быть п там: Jar ** п ** vägstationg ;-) – Andreas

+0

вид дубликата: Производительность на [SPLIT] (HTTP://stackoverflow.com/questions/3601465/string-split-vs-regex-split) – aloisdg

+0

@aloisdg из вашей ссылки: '(используя символ, который больше не будет существовать в строке)' –

ответ

0

@"(?<=^\d[^ ]*) | (?=\d)", как раскол может работать для вас, это, однако, не работать на Hallgartenerstrasse Moritzstr., так как это поставит Hallgartenerstrasse Moritzstr. в матче группы 0 и не 1:

Тест:

using System; 
using System.Text.RegularExpressions; 

public class Example { 
    public static void Main() { 
     string[] inputs = { 
      "Überbrückerstraße 24a", 
      "34 Street Blah Blah", 
      "Hallgartenerstrasse Moritzstr.", 
      "Ueckerstr. 20 b" 
     }; 
     foreach (string input in inputs) { 
      string pat = @"(?<=^\d[^ ]*) | (?=\d)"; 
      string[] matches = Regex.Split(input, pat); 
      foreach (string match in matches) { 
       Console.Write("<{0}>", match); 
      } 
      Console.Write("\n"); 
     } 
    } 
} 

Выведет:

<Überbrückerstraße><24a> 
<34><Street Blah Blah> 
<Hallgartenerstrasse Moritzstr.> 
<Ueckerstr.><20 b> 
+0

Это прекрасно работает для всех адресов, где улица предшествует номеру, но не подходит для адреса, такого как «19 Green Lanes ", например – Nick

+0

@Nick Вы не указали это в своем исходном вопросе. Ни один из других ответов не подходит для этого. – andlrc

+0

Да, я только что обновил вопрос по конкретным сценариям. Извинения, я подумал, что было бы ясно, что я хотел бы получить номер, независимо от того, где это находится в строке. – Nick

1

http://www.phpliveregex.com/p/fWT

var matches = Regex.Match(@"(.*)\s(\d+.*)", input); 
+0

Почему downvote? – Andreas

+0

Возможно, потому что это вызвало ответ cge regex C#, и вы не дали один (а не мой DV btw).Глупый разум для ДВ, если так, поскольку его регулярное выражение, которое вы дали, имеет значение. – Jamiec

+0

Ну, C# был отредактирован в вопросе. Если downvoter хочет, чтобы downvote настолько плохой, возможно, это должен быть вопрос, который не включал язык? – Andreas

0

Если входные строки в том же формате, вы можете использовать:

(?<street>.*) (?<number>.*) 

См Live demo

Затем к нему доступ:

var address = "Überbrückerstraße 24a."; 
var m = Regex.Matches(address, @"(?<street>.*) (?<number>.*)"); 
var street = m[0].Groups["street"].Value; 
var streetNumber = m[0].Groups["number"].Value; 
Console.WriteLine(string.Format("Street Name: {0}, at {1}", street, streetNumber)); 

выходов:

Название улицы: Überbrückerst на 24а.

См live C#


Учитывая то, что вы предоставили после этого, я хотел бы использовать:

^(\d.*?) (.*)|(.*) (\d.*)|(.+) 

где:

  • ^(\d.*?) (.*) совпадает со строкой с номером в начале ;
  • (.*) (\d.*) соответствует строке с номером в конце;
  • (.+) соответствует строке, которая не содержит чисел. Он должен оставаться в конце или он будет захватывать каждый случай.

См Demo

+0

К сожалению, мы никогда не знаем, что вводит там пользователь, поэтому это может быть или или какая-то странная смесь чужих – Nick

+0

@ Ник, тогда вы должны отредактировать свой вопрос с дополнительной информацией о ваших входах. Имейте в виду, что иногда это не стоит расставаться с такими случаями –

+0

Я добавил данные теста на вопрос – Nick

Смежные вопросы