【问题标题】:How can I use RegEx to remove certain words in from string如何使用 RegEx 从字符串中删除某些单词
【发布时间】:2018-07-21 00:15:57
【问题描述】:

我需要清理一些单元格,只保留重要的词以生成搜索索引。

例如。 “如何提出帐户恢复请求”将被修剪为“提出帐户恢复请求”,因为“How, To, An”将在要过滤掉的单词列表中。

另一个复杂性是它也将是法语和西班牙语,这意味着我必须处理像 d' 这样的部分词。

到目前为止,我一直在尝试使用一个函数,但它不适用于部分词 (d'),如果“de”和“des”列在同一个单元格中,它将从 DES 中删除 DE然后只保留孤独的 S,因为不再识别 DES:

Function ClearWords(s As String, rWords As Range) As String
Static RX As Object

If RX Is Nothing Then
    Set RX = CreateObject("VBScript.RegExp")
    RX.Global = True
    RX.IgnoreCase = True
End If

RX.Pattern = "\b" & Replace(Join(Application.Transpose(rWords), "|"), ".", "\.") & "\b"

ClearWords = Application.Trim(RX.Replace(s, ""))
End Function

【问题讨论】:

  • 您是否考虑过同时搜索“account”、“recovery”和“request” ie and() ?
  • 我有,但它将由用户生成并随着时间的推移而扩展。过滤掉常用词会容易得多。
  • 好的,那么删除任何 3 个字母或更少的单词怎么样?
  • 我认为您处理外语的要求对于这个问题来说过于广泛。为此,您很可能需要某种方式从输入中嗅探语言以确定要应用的哪个 组规则(将英文文本发送到法语替换,反之亦然等。)当你到达那一点时,我认为这应该是一个单独的问题,而不是这个问题的一部分。
  • 请考虑添加一个minimal reproducible example(独立示例,不​​依赖于您的工作表——模拟一个简单的字符串数组或分隔列表代表您的工作表应该很容易) rWords 转换。

标签: regex excel vba


【解决方案1】:

如果您计划支持英语、法语和其他欧洲语言,您可以利用我在Regular expression not working for at least one European character (?![×÷])[A-Za-zÀ-ÿ] 发布的正则表达式。这是一个应该匹配您需要支持的所有字母字符的模式。由于您将在 VBA 中使用它,因此将文字扩展字母替换为 \uXXXX 实体并将其转换为单个字符类 [A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF][A-Za-zÀ-ÖØ-öø-ÿ] 带有文字字符)是有意义的。

现在,您需要构建自定义边界。初始边界是字符串的开头^,或除上述字母之外的任何字符(如果您想完全模拟\b,可能还有数字和_)。既然要替换,就需要把这两个模式放到一个(^|[^A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF])捕获组中,在替换模式中使用$1来恢复值,以免丢失。尾随边界是除上述字母(或数字/_)和字符串结尾之外的任何字符。由于 VBA 正则表达式支持前瞻,我们可以只使用 负前瞻(?![A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF])

把它放在一起:

RX.Pattern = "(^|[^A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF])(?:" & Replace(Join(Application.Transpose(rWords), "|"), ".", "\.") & ")(?![A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF])"
ClearWords = Application.Trim(RX.Replace(s, "$1"))

this regex demo

要同时删除之前的空格,请将"(^|[^A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF])(?:" 替换为(?:\s+|(^|[^A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]))(?:。见this regex demo

奖励:您似乎需要转义单词才能在正则表达式中使用它们:

Dim regExEscape As New RegExp
With regExEscape
    .pattern = "[-/\\^$*+?.()|[\]{}]"
    .Global = True
    .MultiLine = False
End With

只要确保您处理所有单词而不是 Replace(Join(Application.Transpose(rWords), "|"), ".", "\.")

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多