替换正则表达式直到找不到匹配项

时间:2016-05-21 08:33:39

标签: regex vbscript

如何更换正则表达式直到替换完所有?

例如,用"(\w{3} \d{1,9})\r?\n\w{2} (\d)" "$1$2"进行4次替换后会得到结果。

文字:

foo 1
ba 1
ba 2
ba 3
ba 4
foo 2
ba 1
ba 2
foo 3
ba 1
ba 2
ba 3

结果:

foo 11234
foo 212
foo 3123

示例代码:

Dim regEx_, stxt
stxt = "foo 1" & VBcr & "ba 1" & VBcr & "ba 2" & VBcr & "ba 3" & VBcr _
  & "ba 4" & VBcr & "foo 2" & VBcr & "ba 1" & VBcr & "ba 2" & VBcr _
  & "foo 3" & VBcr & "ba 1" & VBcr & "ba 2" & VBcr & "ba 3"

Set regEx_ = New RegExp
With regEx_
  .Global = True
  .MultiLine = True
  .IgnoreCase = True
  .Pattern = "(\w{3} \d{1,9})[\r?\n]\w{2} (\d)"
  stxt = regEx_.Replace(stxt, "$1$2")
  stxt = regEx_.Replace(stxt, "$1$2")
  stxt = regEx_.Replace(stxt, "$1$2")
  stxt = regEx_.Replace(stxt, "$1$2")
  stxt = regEx_.Replace(stxt, "$1$2") 'to make sure (real example some time contains up to 30 replacements)
End With
MsgBox stxt

在找不到匹配项之前,有什么方法可以替换吗?像这样:

Do Until regEx_.Test(stxt)
  stxt = regEx_.Replace(stxt, "$1$2")
Loop

2 个答案:

答案 0 :(得分:2)

你很亲密。试试这个。

Do While regEx_.Test(stxt)
    stxt = regEx_.replace(stxt, "$1$2")
Loop

答案 1 :(得分:2)

如果稍微修改表达式,并且使用带有第二个正则表达式的replacement function来删除两个字母行中的所有非数字,则不需要循环:

Function Merge(m, sm1, sm2, pos, src)
  Set re = New RegExp
  re.Global  = True
  re.Pattern = "\D"

  Merge = sm1 & re.Replace(sm2, "")
End Function

Set regEx_ = New RegExp
regEx_.Global  = True
regEx_.Pattern = "(\w{3} \d{1,9})((?:[\r?\n]\w{2} \d)+)"

stxt = regEx_.Replace(stxt, GetRef("Merge"))

((?:[\r?\n]\w{2} \d)+):我对正则表达式所做的修改使用非捕获组((?:...))来匹配一个或多个(+)后续双字母行。然后,外部括号集将一个组中的后续两个字母的行捕获为第二个子匹配(sm2)到替换函数。

替换函数使用第二个正则表达式从两个字母的行中删除所有非数字字符(\D),只留下数字,然后连接到第一个子匹配({{1} },sm1)。

基本上,这样的字符串:

foo 1
ba 1
ba 2
ba 3
ba 4

提供了两个子匹配(\w{3} \d{1,9})

foo 1

sm1(有一个领先的换行符):


ba 1
ba 2
ba 3
ba 4

替换功能会删除sm2以外的所有内容:

1234

并将其附加到sm2

sm1