Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 街道名称和门牌号分开_C#_String - Fatal编程技术网

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号”,我会想办法的。