【问题标题】:Using Regex to replace space with newline in VBA使用正则表达式在 VBA 中用换行符替换空格
【发布时间】:2018-01-21 10:55:43
【问题描述】:

我有以下字符串:

ABCD1234  ABCD1234

我想用换行符替换双倍空格,但保留空格后面的所有文本

这是我正在尝试的:

.Replace what:="  *", replacement:=Chr(10), lookat:=xlPart

它确实用换行符替换了空格,但删除了空格后面的其余字符串

我希望替换操作只匹配字符串后面有文本的情况

【问题讨论】:

  • 可以用替代品吗?
  • 您还应该发布一个最小代码sn-p,这将使我们更容易为您提供帮助。
  • 尽量使用" +",这样就不会替换空子串

标签: regex vba replace


【解决方案1】:

星号 * 匹配文本的其余部分,因此其余文本将被替换。

你说你只想替换两个空格,所以你不应该包括星号。

如果您想替换两个或多个空格,那么 AFAIK Range.Replace 函数不支持实际的正则表达式(您可以在其中指定“两个或多个空格”),因此您必须求助于使用 RegEx 库和操作每个单元格通过代码(即在代码中,逐个单元格地遍历范围,并使用 VBScript RegEx 库对单元格的值应用正则表达式替换,您可以轻松地对其进行谷歌搜索)。

编辑:使用 VBScript RegExp 对象的替代方法

如上所述,要使用实际的正则表达式,您可以自己迭代单元格并使用 VBScript RegExp 对象进行替换。以下内容在活动工作表中查找包含字符后跟两个空格后跟字符的单元格,并将这两个空格替换为 Chr(10)。

Sub foo()
    Dim rng As Range
    Set rng = ActiveSheet.UsedRange
    Dim regex As New RegExp
    regex.Pattern = "([^ ]+)  ([^ ]+)"
    Dim cell As Range
    For Each cell In rng
        If Not cell.HasFormula Then
            cell.Value = regex.Replace(cell.Value, "$1" & Chr(10) & "$2")
        End If
    Next
End Sub

您需要将 VBScript 正则表达式库添加到项目的引用中。

【讨论】:

  • 在这种情况下,如何告诉替换操作仅匹配空格后有文本的情况,同时防止其余文本被替换?
  • @Dan - 你不能。 Excel 的 Range.Replace 函数不使用正则表达式,也不支持“查找两个空格后跟文本”。您将不得不自己遍历单元格并应用 RegExp 对象。我会补充答案...
  • 刚刚试过,效果很好!我有一个非常特殊的双空格案例,我发现 split & join 更易于使用,但在其他使用正则表达式的情况下,迭代选项肯定对我有用
【解决方案2】:

是什么阻止您拆分双倍空格并加入 vbNewline?即

Option Explicit

Sub ReplaceSubstring()

Debug.print join(Split("ABCD1234 ABCD1234", "  ", -1,vbbinarycompare),vbNewline)

End sub

它是否可靠地为您提供所需的输出?

【讨论】:

  • 我应该想到 Split 和 Join 组合,它完全符合我的要求!
猜你喜欢
  • 2018-03-23
  • 1970-01-01
  • 2020-09-12
  • 2013-03-09
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 2021-07-04
  • 2012-06-18
相关资源
最近更新 更多