【问题标题】:trimming/splitting a string to get a street and number修剪/拆分字符串以获得街道和数字
【发布时间】:2019-01-16 22:44:54
【问题描述】:

我正试图找出我如何以最好的方式做到这一点。我在 VB.NET 的 .NET 2.0 中工作(这不是可选的)。这是我的问题。

我得到一个包含街道和数字的字符串。让我们说“街道名称 123” 我需要一个字符串“Streetname”和一个字符串“123”。这对我来说很简单。但是还有其他可能的选择。如“123 Streetname”、“Streetname A123”、“Street name 123”、“123A Street name”……

所以我需要找到适合这些可能选项的东西。

问候,

比约恩

【问题讨论】:

  • 你在街道上也有公寓或号码吗? “第三街 123 公寓 4”
  • 这是针对欧洲的。我不认为欧洲的街道有数字。但我想公寓号码是可能的。

标签: .net vb.net split .net-2.0 trim


【解决方案1】:

Regex 可能是您最灵活的选择。如果您还没有学习过正则表达式,我会警告您,它有一个相当长的学习曲线,但我向您保证,这是值得的。在这种情况下,使用 regex 将允许您在将来轻松修改和扩展解析规则,这几乎肯定是必要的。下面是一个使用正则表达式来满足您规定的规范的方法示例:

Public Function ParseAddress(input As String) As Address
    Dim streetNumberPattern As String = "(?<StreetNumber>[\d\w]+)"
    Dim streetNamePattern As String = "(?<StreetName>\D*?)"
    Dim pattern As String = $"^\s*({streetNamePattern}\s+{streetNumberPattern}|{streetNumberPattern}\s+{streetNamePattern})\s*$"
    Dim m As Match = Regex.Match(input, pattern)
    Dim result As New Address()
    If m.Success Then
        result.StreetNumber = m.Groups("StreetNumber").Value
        result.StreetName = m.Groups("StreetName").Value
    End If
    Return result
End Function

Public Class Address
    Public Property StreetNumber As String
    Public Property StreetName As String
End Class

完整的正则表达式模式(pattern 变量的内容),连接在一起后,是:

^\s*((?<StreetName>\D*?)\s+(?<StreetNumber>[\d\w]+)|(?<StreetNumber>[\d\w]+)\s+(?<StreetName>\D*?))\s*$

我只是将它分解为多个字符串文字,以使其更易于阅读和维护。

如您所见,它非常强大。您可以将大量解析规则塞进一个非常短的模式中。我提供的模式无法处理所有可能的排列,但它是一个好的开始,并且通过使用正则表达式模式,以后可以很容易地添加到它。

【讨论】:

  • 我在这段代码中遇到了很多问题。知道我需要在 vb.net 2.0 中工作。这似乎缺少正则表达式的东西?
  • Regex 类自 1.1 版以来一直是 .NET Framework 的一部分,因此它肯定在 2.0 中可用 Here 是它的 2.0 版本的文档。在 .NET 2.0 中,它是由 System.dll 声明的,因此您必须已经拥有对它的引用。所以我的猜测是你只是没有导入命名空间。尝试在代码文件的顶部添加 Imports System.Text.RegularExpressions 行。
猜你喜欢
  • 2018-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
相关资源
最近更新 更多