正则表达式从文本块中提取Suburbs

时间:2011-12-13 05:14:00

标签: regex vba outlook

这可能是一项不可能完成的任务,我似乎无法找到有关旧谷歌的有用答案。

我想要做的是从一块文字中拉出郊区。有一种通用的格式,所以我认为它应该是可能的。

即。 “兰德代尔(华盛顿州)地区的服务可能会中断”

它并不总是适当大写,可能包含多个单词的郊区(例如“South Coogee”)或者它可能包含多个郊区。郊区总是在“区域”或“区域”之后,郊区总是先于“(WA)”。

我对正则表达式的经验非常有限,所以我不知道从哪里开始。解决方案会很棒,但如果没有人有时间/耐心为此开发正则表达式字符串查询,我很高兴能指出正确的方向。

4 个答案:

答案 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)”之间选择尽可能少的重复单词。如果你的文字可能有不规则的间距,你就必须调整它。