如何使用RegEx将字符串拆分为2个字符串?

时间:2013-09-13 13:54:15

标签: c# regex string

我需要一个regEx来检索字符串和streetnumber的街道。让我们考虑一下,街道名称从头开始,直到有一个空格后跟一个数字

示例:

原文字符串:' Jan van Rijswijcklaan 123' 结果应该是:' Jan van Rijswijcklaan'作为街道名称和' 123'作为街道号码。

感谢任何帮助。

更新

我能够获得街道名称和号码,但有时候我有街道号码,如' 123b a1'然后代码在定义streetnumber时失败了。因此,街道号码只是' a1'而不是' 123b a1'。

所以目前我正在处理2个场景:

  1. 当streetname仅包含字母字符且数字仅包含数字时 - 例如' Jan van Rijswijcklaan 123'
  2. 当街道名称仅包含字母字符且数字包含字母数字字符时 - 例如' Jan van Rijswijcklaan 123b a1'
  3. 这是我尝试过的代码:

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

5 个答案:

答案 0 :(得分: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将街道号码从字符串转换为int

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

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

答案 3 :(得分:0)

只需用lookahead解决@Ilya_Ivanov的答案:

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

答案 4 :(得分: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 +)$