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

Regex 如何匹配字符串末尾的子字符串,然后仅删除该子字符串?,regex,vba,replace,trim,Regex,Vba,Replace,Trim,我在每个单元格中都有一列文本,其中许多单元格的末尾都有字符串null。我希望解析列中的每个单元格,如果单元格的内容以该字符串结尾,则只从单元格中删除null 到目前为止,我所写的内容成功地从结尾移除null,如果它和前面的单词之间有空格,但是如果前面的单词和null之间没有空格,则移除整个单元格的内容 Sub-TruncateNulls() 将strPattern设置为字符串:strPattern=“\w*null\b” 将strReplace设置为字符串:strReplace=“” Dim r

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

到目前为止,我所写的内容成功地从结尾移除
null
,如果它和前面的单词之间有空格,但是如果前面的单词和
null
之间没有空格,则移除整个单元格的内容

Sub-TruncateNulls()
将strPattern设置为字符串:strPattern=“\w*null\b”
将strReplace设置为字符串:strReplace=“”
Dim regEx作为新的RegExp
像弦一样的模糊的条纹
ActiveSheet.Range(“A2”)。选择
当ActiveCell.Value“”时执行此操作
strInput=ActiveCell.Value
用正则表达式
.Global=False
.MultiLine=True
.IgnoreCase=True
.Pattern=strPattern
以
如果正则表达式测试(strInput),则
ActiveCell=regEx.Replace(strInput,strReplace)
如果结束
ActiveCell.Offset(1,0)。选择
环
端接头
输入数据示例:

words
null
wordsnull
words null
nullwords
所需输出数据:

words

words
words
nullwords
无论前面的字符是什么,我如何调整此设置以仅删除结尾的
null


或者,我愿意使用Excel的
查找
功能,或者在搜索和替换窗口中使用特定的通配符/通配符组合(如果其中一个选项有效)。

如果您喜欢当前方法,则需要将模式替换为

\s*null\s*$

详细信息

  • \s*
    -0+空格(如果不想跨行溢出,请将
    \s
    替换为空格或
    [^\s\r\n]
  • null
    -a
    null
    子字符串
  • \s*
    -1个或多个空格(请参见与上面相同的注释)
  • $
    -行尾(将
    .Multiline
    标志设置为False以匹配字符串的结尾)
在本例中,比正则表达式更简单的方法是使用
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
Do While ActiveCell.Value“”
strInput=ActiveCell.Value
如果Right(strInput,4)=“null”,则
ActiveCell.Value=Left(strInput,Len(strInput)-4)
如果结束
ActiveCell.Offset(1,0)。选择
环

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

使用
。用模式
\s*null$
替换
,以删除每个单元格末尾的所有引用。还应该考虑加载数组中的范围以提高执行时间。

Sub TruncateNulls()
    Dim rg As Range, data()

    ' select the range to the last row
    Set rg = Range(Range("A2"), Range("A" & rows.Count).end(xlUp))

    ' load the data in an array
    data = rg.value

    ' replace each value with a regex
    ArrayReplace data, pattern:="\s*null$", replacement:=Empty

    ' write the array back to the sheet
    rg.value = data
End Sub


Sub ArrayReplace(data(), pattern As String, replacement As String)
    Dim re As New RegExp, r As Long, c As Long

    re.Global = True
    re.MultiLine = False
    re.IgnoreCase = True
    re.pattern = pattern

    For c = 1 To UBound(data, 2)
        For r = 1 To UBound(data, 1)
            If VarType(data(r, c)) = vbString Then
                data(r, c) = re.Replace(data(r, c), replacement)
            End If
        Next
    Next
End Sub

如果strInput像“*null”,那么该站点非常有用,谢谢!如果我知道的话,可能会更容易找到解决方案。在它上面,我发现
\snall$
\snll\b
似乎同样有效。@TylerH请记住
\b
是a,而
$
是a。他们的行为不同。
null
之后的
\b
要求下一个字符为非字母、非数字和非
\u
或字符串结尾<代码>$
只需要字符串结尾。所有答案都有效,而且速度相当快,但这似乎是最有效的,这使得它对本次和未来的工作最有用。