这可能是一项不可能完成的任务,我似乎无法找到有关旧谷歌的有用答案。
我想要做的是从一块文字中拉出郊区。有一种通用的格式,所以我认为它应该是可能的。
即。 “兰德代尔(华盛顿州)地区的服务可能会中断”
它并不总是适当大写,可能包含多个单词的郊区(例如“South Coogee”)或者它可能包含多个郊区。郊区总是在“区域”或“区域”之后,郊区总是先于“(WA)”。
我对正则表达式的经验非常有限,所以我不知道从哪里开始。解决方案会很棒,但如果没有人有时间/耐心为此开发正则表达式字符串查询,我很高兴能指出正确的方向。
答案 0 :(得分:4)
说实话,Regex在我看来有点矫枉过正,所以我甚至都不打扰,只使用原生的VBA字符串操作函数。
s = "Services in the area of landsdale (WA) may be disrupted"
prefix1 = "area of"
prefix2 = "areas of"
suffix = "(WA)"
' Is it "area" or "areas"?
If InStr(s, prefix1) > 0 Then
prefix = prefix1
Else
prefix = prefix2
End If
suburb = Trim(Mid(s, InStr(s, prefix) + Len(prefix) + 1, _
InStr(s, suffix) - InStr(s, prefix) - Len(prefix) - 1))
此外,“landsdale(WA)的区域”并没有真正具有语法意义(为什么是复数?),这让我怀疑你有时会有这种形式的短语:“ landsdale(WA)和crumpetville(WA)地区“或”landsdale,crumpetville和metawan(WA)地区“。但这只是我的猜测。
答案 1 :(得分:3)
我想为您提供完整的正则表达式示例供您参考。我个人认为在这种情况下它不是很可怕:)我很抱歉我不确定如何修改它(如果ata ll)在Outlook中使用,但这是函数,因为它将用Excel编写
Function ExtractSuburb(ByVal text As String)
Dim RE As Object, allMatches As Object
Set RE = CreateObject("vbscript.regexp")
RE.pattern = "areas? of (.+) \(WA\)"
RE.Global = True
Set allMatches = RE.Execute(text)
ExtractSuburb = allMatches.Item(0).submatches.Item(0)
End Function
从字面上看,这种模式告诉函数抓住“区域/区域”和“(WA)”之间的任何东西。我可以看到正则表达式的内部运作方式可能会让人感到困惑,因此让Jean提供了不同的解决方案。
答案 2 :(得分:1)
根据您的数据,您可能会忽略第一个和最后一个部分,只处理“landsdale(WA)区域”。使用以下正则表达式:
areas? of (.+?) \(WA\)
匹配(郊区)的“区域”或“区域”,然后是“(WA)”。
我希望这会有所帮助,如果需要,我可以扩展它以更好地适应您的数据。
答案 3 :(得分:1)
您没有说明要使用哪种正则表达式方法,但/areas? of (\w+(\s\w+)*?) \(WA\)/
之类的内容应该适用于任何合理的Perl风格的实现。 *?在“of”和“(WA)”之间选择尽可能少的重复单词。如果你的文字可能有不规则的间距,你就必须调整它。