修剪/分割字符串以获得街道和号码

时间:2018-08-09 12:48:56

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

我正在尝试找出如何以最佳方式进行此操作。我正在VB.NET中的.NET 2.0中工作(这不是可选的)。这是我的问题。

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

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

此致

比约恩

1 个答案:

答案 0 :(得分:0)

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

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*$

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

如您所见,它非常强大。您可以将很多解析规则塞入非常短的模式。我提供的模式无法处理所有可能的排列,但这是一个好的开始,通过使用正则表达式模式,将来可以轻松添加它。