正则表达式匹配空格分隔的字母数字字符串

时间:2016-06-07 10:49:54

标签: c# regex

我有一个空格分隔的地址字符串,我想将这个数字与街道名称分开。

所以如果我们有:

  街道Blah Blah 34

  34街道Blah Blah

我想要一个正则表达式匹配“Street Blah Blah”而另一个匹配“34”

使用这样的地址会变得更复杂:

  

Überbrückerstraße24a。

它应返回“24a”,其余为街道或

  

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

是最棘手的,在这种情况下,我不介意那个人现在是否失败。

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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>

答案 2 :(得分: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ückerstraße,at 24a。

请参阅live C#

根据你提供的内容,我会使用:

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

其中:

  • ^(\d.*?) (.*)将字符串与开头的数字匹配;
  • (.*) (\d.*)将字符串与末尾的数字匹配;
  • (.+)匹配不包含数字的字符串。 必须保持在最后,否则它将捕获每一个案例。

请参阅Demo