我有一个空格分隔的地址字符串,我想将这个数字与街道名称分开。
所以如果我们有:
街道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
是最棘手的,在这种情况下,我不介意那个人现在是否失败。
答案 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