【发布时间】:2022-11-10 23:01:53
【问题描述】:
我正在使用 excel 2019,我正在尝试从一堆乱七八糟的文本单元格中提取任何(最多 5 个)以 . 之后的点结尾的单词。
这是我要解析/清理的文本示例 `
some text [asred.] ost. |Monday - Ribben (ult.) lot. ac, sino. other maybe long text; collan.
`
我希望得到这个:
ost. ult. lot. sino. collan.
我正在使用在互联网上某个地方找到的这个功能,它似乎可以完成这项工作: `
Public Function RegExtract(Txt As String, Pattern As String) As String
With CreateObject("vbscript.regexp")
'.Global = True
.Pattern = Pattern
If .test(Txt) Then
RegExtract = .Execute(Txt)(0)
Else
RegExtract = "No match found"
End If
End With
End Function
`
我从一个空单元格中调用它:
=RegExtract(D2; "([\]])(\s\w+[.]){0,5}")
这是我第一次使用正则表达式,所以我可能在专家眼中做了可怕的事情。
所以这是我的表达: ([]])(\s\w+[.]){0,5}
现在它只返回
] ost.
这比我在第一种正则表达式方法中所期望的要多得多,但是:
- 我无法摆脱第一个 ] ,因为 \K 在 excel 中不起作用,所以它需要在文本块内找到我有用的位开始的位置。我以后可能会“找到并替换”它作为一个聪明的野蛮人,但我想知道如何做到干净,如果有任何干净的方法存在的话:)
2)我不明白迭代器如何工作以获取所有“最多 5 次发生”:我期待第二组之后的 {0,5} 完全意味着:“再次重复前一组,直到文本块结束(或者直到你成功完成 5 次)”。
感谢您的时间 :)
--在JdvD接受记录后添加--
在第一次出现右括号之后,我正在使用这种模式来获取所有以点结尾的单词。 JdvD 建议的模式是同一字符的最后一次出现。
"^\]|(\w+\.\s?)|."我什至在我的 regExtract 函数中遗漏了一些东西:通过 for 循环的匹配数组,假设正则表达式引擎已经将匹配存储为唯一字符串。
【问题讨论】:
标签: excel regex vba regex-group