VBScript RegEx - 查找模式之间的数据块

时间:2017-02-16 11:52:33

标签: regex vbscript

我正在尝试使用RegEx从多行字符串中获取数据块。

要搜索的字符串

***** a.txt
17=xxx
570=N
55=yyy
***** b.TXT
17=XXX
570=Y
55=yyy
*****

***** a.txt
38=10500.000000
711=1
311=0000000006630265
***** b.TXT
38=10500.000000
311=0000000006630265
*****

我需要什么 - ***** block

之间的任何内容
17=xxx
570=N
55=yyy

17=XXX
570=Y
55=yyy

38=10500.000000
711=1
311=0000000006630265

38=10500.000000
311=0000000006630265

到目前为止我的代码

Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.Global = True
objRegEx.MultiLine = True
objRegEx.IgnoreCase = True
objRegEx.Pattern = "\*\*\*\*\*(?:.|\n|\r)*?\*\*\*\*\*"
Set strMatches = objRegEx.Execute(objExec.StdOut.ReadAll())
If strMatches.Count > 0 Then
    For Each strMatch In strMatches
        Wscript.Echo strMatch
    Next
End If
Set objRegEx = Nothing

2 个答案:

答案 0 :(得分:3)

您需要将消费模式的最后*个匹配部分转变为积极的前瞻。此外,强烈推荐摆脱(.|\r|\n)*?,因为它会减慢匹配过程,而是使用[\s\S]*?

使用

\*{5}(?!\s*\*{5}).*[\r\n]+([\s\S]*?)(?=\*{5})

并抓住Submatches中的第一项。使用.*[\r\n]+,我建议跳过*****起始行的其余部分。

<强>详情:

  • \*{5} - 5个星号
  • (?!\s*\*{5}) - 如果有0个空格后跟5个星号,则匹配失败
  • .*[\r\n]+ - 使用换行符匹配行的其余部分
  • ([\s\S]*?) - 捕获第1组(其值存储在Match对象的Submatches属性中),匹配任何0 +字符,尽可能少于第一个....
  • (?=\*{5}) - 位置后跟5个未消耗的星号,只检查它们的存在。

请参阅regex demo

如果您展开正则表达式,它看起来会更加丑陋,但效率更高:

\*{5}(?!\s*\*{5}).*[\r\n]+([^*]*(?:\*(?!\*{4})[^*]*)*)

请参阅another regex demo

VBS代码:

Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.Global = True
objRegEx.Pattern = "\*{5}(?!\s*\*{5}).*[\r\n]+([^*]*(?:\*(?!\*{4})[^*]*)*)"
Set strMatches = objRegEx.Execute(objExec.StdOut.ReadAll())
If strMatches.Count > 0 Then
    For Each strMatch In strMatches
        Wscript.Echo strMatch.Submatches(0)
    Next
End If
Set objRegEx = Nothing

答案 1 :(得分:2)

只捕捉连续编号的行

std::vector<const char* const>