如何使用正则表达式将字符串拆分为 2 个字符串
本文关键字:字符串 拆分 正则表达式 何使用 | 更新日期: 2023-09-27 18:31:08
我需要一个正则表达式来检索字符串的街道和街道号码。让我们考虑街道名称从开头开始,直到有一个空格后跟一个数字
例:
原弦:"Jan van Rijswijcklaan 123"结果应该是:"Jan van Rijswijcklaan"作为街道名称,"123"作为街道编号。
任何帮助不胜感激。
更新
我能够获得街道名称和号码,但有时我有像"123b a1"这样的街道号码,然后代码无法定义街道号码。结果,门牌号只有"a1"而不是"123b a1"。
所以目前我正在处理 2 种情况:
- 当街道名称仅包含字母字符而数字仅包含数字时 - 例如"Jan van Rijswijcklaan 123"
- 当街道名称仅包含字母字符且数字包含字母数字字符时 - 例如"Jan van Rijswijcklaan 123b a1"
这是我尝试过的代码:
string street = Regex.Match(streetWithNum, @"^[^0-9]*").Value + ";";
string number = Regex.Match(streetWithNum, @"'w'd*'w?'d*$").Value + ";";
使用积极的前瞻模式搜索拆分条件:
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+)$ 保留一系列数字