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*$
见
详细信息
-0+空格(如果不想跨行溢出,请将\s*
替换为空格或\s
)[^\s\r\n]
-anull
子字符串null
-1个或多个空格(请参见与上面相同的注释)\s*
-行尾(将$
标志设置为False以匹配字符串的结尾)李>.Multiline
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
或字符串结尾<代码>$
只需要字符串结尾。所有答案都有效,而且速度相当快,但这似乎是最有效的,这使得它对本次和未来的工作最有用。