如何使用正则表达式将字符串拆分为 2 个字符串

本文关键字:字符串 拆分 正则表达式 何使用 | 更新日期: 2023-09-27 18:31:08

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

例:

原弦:"Jan van Rijswijcklaan 123"结果应该是:"Jan van Rijswijcklaan"作为街道名称,"123"作为街道编号。

任何帮助不胜感激。

更新

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

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

  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 + ";";

如何使用正则表达式将字符串拆分为 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

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

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

演示

如果你想同时取两者,街道名称和数字:

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));

不仅仅是用展望来修复@Ilya_Ivanov的答案:

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

这里也是一个非正则表达式解决方案;

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

这是一个演示

这应该可以:

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+)$ 保留一系列数字