我正在尝试找出如何以最佳方式进行此操作。我正在VB.NET中的.NET 2.0中工作(这不是可选的)。这是我的问题。
我得到了一个包含街道和数字的字符串。可以说“街道名123” 我需要一个字符串“ Streetname”和一个字符串“ 123”。这对我来说很简单。但是,还有其他可能的选择。例如“ 123 Streetname”,“ Streetname A123”,“ Street name 123”,“ 123A Street name”,...
所以我需要找到一些适合这些可能选项的东西。
此致
比约恩
答案 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*$
我只是将其分解为多个字符串文字,以便于阅读和维护。
如您所见,它非常强大。您可以将很多解析规则塞入非常短的模式。我提供的模式无法处理所有可能的排列,但这是一个好的开始,通过使用正则表达式模式,将来可以轻松添加它。