0

我需要一个正则表达式来检索字符串的街道和街道号码。让我们考虑街道名称从头开始直到有一个空格后跟一个数字

例子:

原始字符串:'Jan van Rijswijcklaan 123' 结果应为:'Jan van Rijswijcklaan' 作为街道名称,'123' 作为街道编号。

任何帮助表示赞赏。

更新

我能够获得街道名称和号码,但有时我有像“123b a1”这样的街道号码,然后代码无法定义街道号码。由于街道号码的结果只有“a1”而不是“123b a1”。

所以目前我正在处理两种情况:

  1. 当街道名称仅包含字母字符且数字仅包含数字时 - 例如“Jan van Rijswijcklaan 123”
  2. 当街道名称仅包含字母字符且数字包含字母数字字符时 - 例如“Jan van Rijswijcklaan 123b a1”

这是我尝试过的代码:

string street = Regex.Match(streetWithNum, @"^[^0-9]*").Value + ";";
string number = Regex.Match(streetWithNum, @"\w\d*\w?\d*$").Value + ";";
4

5 回答 5

2

使用正向前瞻模式搜索拆分条件:

var s = "Jan van Rijswijcklaan 124";
var result = Regex.Split(s, @"\s(?=\d)");

Console.WriteLine("street name: {0}", result[0]);
Console.WriteLine("street number: {0}", result[1]);

印刷:

street name: Jan van Rijswijcklaan
street number: 124

注意:如果需要,请使用Int32.TryParse将街道号码从字符串转换为整数

于 2013-09-13T13:57:21.703 回答
1

我不是正则表达式的粉丝,你注意到了吗?

IEnumerable<string> nameParts = "Jan van Rijswijcklaan 124".Split()
    .TakeWhile(word => !word.All(Char.IsDigit));
string name = string.Join(" ", nameParts);

DEMO

如果您想同时使用街道名称和号码:

string[] words = "Jan van Rijswijcklaan 124".Split();
var streetNamePart = words.TakeWhile(w => !w.All(Char.IsDigit));
var streetNumberPart = words.SkipWhile(w => !w.All(Char.IsDigit));
Console.WriteLine("street-name: {0}", string.Join(" ", streetNamePart));
Console.WriteLine("street-number: {0}", string.Join(" ", streetNumberPart));
于 2013-09-13T14:02:00.387 回答
0

这里还有一个非正则表达式解决方案;

string str = "Jan van Rijswijcklaan 124";
var array = str.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);

string streetname = "";
string streetnumber = "";
foreach (var item in array)
{
     if (Char.IsNumber(item[0]))
         streetnumber += item;
      else
         streetname += item + " ";
}

Console.WriteLine(streetname.TrimEnd());
Console.WriteLine(streetnumber);

输出将是;

Jan van Rijswijcklaan
124

这里一个DEMO.

于 2013-09-13T14:02:53.263 回答
0

不仅仅是用前瞻修复@Ilya_Ivanov 的答案:

var result = Regex.Split(s, @"\s(?=\d)");
于 2013-09-13T14:04:13.600 回答
0

这应该这样做:

Regex r = new Regex(@"(.+?) (\d+)$");
Match m = r.Match("Jan van Rijswijcklaan 124");
String street = m.Groups[1].Value;
String number = m.Groups[2].Value;

我是凭记忆输入的,不要怪我错别字:)

编辑:正则表达式字符串末尾的“$”确保数字匹配仅出现在输入字符串的末尾。

编辑2:刚刚删除了错别字并测试了代码,它现在可以工作了。

编辑3:表达式可以读作:收集尽可能多的字符进入第1组而不是贪婪(。+?),但在字符串末尾留下一个数字序列,在空格之后,为第2组( \d+)$

于 2013-09-13T14:06:18.953 回答