如何匹配字符串末尾的子字符串,然后只删除该子字符串?

时间:2017-08-01 16:52:11

标签: regex vba replace trim

我在每个单元格中都有一列文本,其中许多单词的末尾都有字符串null。我想解析列中的每个单元格,如果单元格的内容以该字符串结尾,则从单元格中删除 null

我目前所写的内容如果它与前一个单词之间有空格,则会成功删除null,但会删除整个单元格如果前一个单词与null之间没有空格,则为内容。

Sub TruncateNulls()

    Dim strPattern As String: strPattern = "\w*null\b"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String

    ActiveSheet.Range("A2").Select

    Do While ActiveCell.Value <> ""
        strInput = ActiveCell.Value

        With regEx
            .Global = False
            .MultiLine = True
            .IgnoreCase = True
            .Pattern = strPattern
        End With

        If regEx.Test(strInput) Then
            ActiveCell = regEx.Replace(strInput, strReplace)
        End If

        ActiveCell.Offset(1, 0).Select
    Loop

End Sub

示例输入数据:

words
null
wordsnull
words null
nullwords

所需的输出数据:

words

words
words
nullwords

如何将此调整为仅删除结尾null,而不考虑前面的字符?

或者,我可以使用Excel的Find功能,或者搜索&amp;中的特定通配符/通配符组合。如果其中任何一个选项有效,请替换窗口。

3 个答案:

答案 0 :(得分:3)

如果您更喜欢当前的方法,则需要用

替换模式
\s*null\s*$

请参阅regex demo

<强>详情

  • \s* - 0+空格(用空格替换\s,如果不想跨越行溢出,则为[^\S\r\n]
  • null - null子字符串
  • \s* - 一个或多个空格(请参阅上面的相同说明)
  • $ - 行尾(将.Multiline标记设置为 False 以匹配字符串的结尾)。

答案 1 :(得分:2)

在这种情况下,比正则表达式更简单,只需使用Right()函数检查最后4个字符。您的代码可以缩减为

Do While ActiveCell.Value <> ""
    strInput = ActiveCell.Value
    If Right(strInput, 4) = "null" Then
        ActiveCell.Value = Left(strInput, Len(strInput)-4)
    End If
    ActiveCell.Offset(1, 0).Select
Loop

根据我的理解,这也更有效(并且可以通过定义范围并将其值复制到数组来提高效率。)

答案 2 :(得分:2)

使用SELECT * FROM a,aa,aaap,aabvf WHERE date='2017-07-21' 模式.Replace删除每个单元格末尾的所有匹配项。您还应该考虑在数组中加载范围以缩短执行时间。

\s*null$