如何在RegExp中使用Visual Basic中的vbNewLine

时间:2017-07-12 13:56:19

标签: regex vbscript

我有一个问题,即使用Visual Basic删除任意文本中广泛使用的vbNewLine。

我最想要的是:当有超过两个vbNewLine之后,除了前两个之外都删除了所有。

例如:

This is some sample text.

It contains a lot of new lines.



Too much in fact.

归结为:

This is some sample text.

It contains a lot of new lines.

Too much in fact.

代码示例:

Dim testText : testText = "This is some sample text." & vbNewLine &  vbNewLine & "It contains a lot of new lines." & vbNewLine & vbNewLine & vbNewLine & vbNewLine & "Too much in fact."

Dim objRegExp
Set objRegExp = New RegExp

objRegExp.Pattern = "" & "vbNewLine" & "{2,}"
'objRegExp.Pattern = "" & "vbNewLine" -> Works for single vbNewLine's
'objRegExp.Pattern = "" & "vbNewLine" -> Works for multiple instances of a (aa, aaa, aaaa, etc.)

Dim result : result = objRegExp.Replace(testText, vbNewLine)

然而,我的模式似乎是错误的。如果我使用“”& “vbNewLine”作为模式,我可以替换每一个换行符。当我使用“a {2,}”时,我可以替换任何数量的> = 2,这正是我想要的,但对于vbNewLines。但是上面的代码不起作用。有关如何进行的任何建议?使用“\ r \ n”还没有帮助我...

1 个答案:

答案 0 :(得分:1)

使用以下表达式:

(\r?\n)(?:\r?\n){2,}

并替换为$1$1。请参阅regex demo

在代码中:

objRegExp.Pattern = "(\r?\n)(?:\r?\n){2,}"
objRegExp.Global = True

然后

Dim result : result = objRegExp.Replace(testText, "$1$1")

Global应为 True 以替换所有非重叠的实例。

模式详情

  • (\r?\n) - 捕获与可选 vbCr 匹配的第1组,然后使用 vbLf
  • (?:\r?\n){2,} - 第1组中使用的2个或更多个模式序列。

$1是对第1组内捕获的换行符的反向引用。

如果您想对换行符进行硬编码,请在替换中使用vbCrLf & vbCrLf。或者你需要的任何其他换行风格。