我正在尝试使用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
答案 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})[^*]*)*)
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>