C# 街道名称和门牌号分开
我必须把门牌号和街道从一个字符串中分割出来 现在我有一个工作程序,可以像这样分割地址:C# 街道名称和门牌号分开,c#,string,C#,String,我必须把门牌号和街道从一个字符串中分割出来 现在我有一个工作程序,可以像这样分割地址: 1号测试街 一条测试街 测试街1a号 测试街1 Teststreet 1 a 测试街1a string street=Teststreet 1; 字符串houseNr=“”; 对于(int k=0;k
- 1号测试街
- 一条测试街
- 测试街1a号
- 测试街1
- Teststreet 1 a
- 测试街1a
string street=Teststreet 1;
字符串houseNr=“”;
对于(int k=0;k
但这不能像这样分割地址:
- 测试街1 a-f
- 测试街1a-f
- 测试街1号a-f
- 测试街1a-f
using System.Text.RegularExpressions;
...
private static (string street, string number) SplitStreet(string value) {
var match = Regex.Match(value, @"\p{L}{2,}(?:\s\p{L}+)*");
string street = match.Value;
string number = (match.Index > 0)
? value.Substring(0, match.Index)
: value.Substring(match.Index + match.Length);
return (street, number.Trim());
}
演示:
string[] tests = new string[] {
"1 Teststreet",
"1 a Teststreet",
"1a Teststreet",
"Teststreet 1",
"Teststreet 1 a",
"Teststreet 1a",
"Teststreet 1 a-f",
"Teststreet 1a-f",
"1 a-f Teststreet",
"1a-f Teststreet",
"King George V 3a(1)",
"3a(1) King George V",
"Невский проспект 15a/4", // a bit of Russian
};
string result = string.Join(Environment.NewLine, tests
.Select(test => new {
raw = test,
address = SplitStreet(test)
})
.Select(test=> $"{test.raw,25} -> {test.address.street} :: {test.address.number}")) ;
Console.Write(result);
1 Teststreet -> Teststreet :: 1
1 a Teststreet -> Teststreet :: 1 a
1a Teststreet -> Teststreet :: 1a
Teststreet 1 -> Teststreet :: 1
Teststreet 1 a -> Teststreet :: 1 a
Teststreet 1a -> Teststreet :: 1a
Teststreet 1 a-f -> Teststreet :: 1 a-f
Teststreet 1a-f -> Teststreet :: 1a-f
1 a-f Teststreet -> Teststreet :: 1 a-f
1a-f Teststreet -> Teststreet :: 1a-f
King George V 3a(1) -> King George V :: 3a(1)
3a(1) King George V -> King George V :: 3a(1)
Невский проспект 15a/4 -> Невский проспект :: 15a/4
结果:
string[] tests = new string[] {
"1 Teststreet",
"1 a Teststreet",
"1a Teststreet",
"Teststreet 1",
"Teststreet 1 a",
"Teststreet 1a",
"Teststreet 1 a-f",
"Teststreet 1a-f",
"1 a-f Teststreet",
"1a-f Teststreet",
"King George V 3a(1)",
"3a(1) King George V",
"Невский проспект 15a/4", // a bit of Russian
};
string result = string.Join(Environment.NewLine, tests
.Select(test => new {
raw = test,
address = SplitStreet(test)
})
.Select(test=> $"{test.raw,25} -> {test.address.street} :: {test.address.number}")) ;
Console.Write(result);
1 Teststreet -> Teststreet :: 1
1 a Teststreet -> Teststreet :: 1 a
1a Teststreet -> Teststreet :: 1a
Teststreet 1 -> Teststreet :: 1
Teststreet 1 a -> Teststreet :: 1 a
Teststreet 1a -> Teststreet :: 1a
Teststreet 1 a-f -> Teststreet :: 1 a-f
Teststreet 1a-f -> Teststreet :: 1a-f
1 a-f Teststreet -> Teststreet :: 1 a-f
1a-f Teststreet -> Teststreet :: 1a-f
King George V 3a(1) -> King George V :: 3a(1)
3a(1) King George V -> King George V :: 3a(1)
Невский проспект 15a/4 -> Невский проспект :: 15a/4
你还有地址的其他部分吗?你可以通过谷歌或其他服务查找地址,并获得地址的部分内容。否则我怀疑你会找到一个可靠的算法“12街123号”@Crowcoder:这就是我说的“简单的情况”:自然语言处理是一件复杂的事情。例如,我同意“圆明园-圆明园”,这就是我说“不可靠”的原因。如果只需要分析这些情况,那么您不需要任何算法,只需对结果进行硬编码即可。@DmitryBychenko感谢您的解决方案。这对我来说非常合适。至于地址“12街123号”,我会想办法的。