VB2010:我的文本包含以日期和时间DD HHMM开头的文本块,并且仅在第二天/时间结束。
这是我的示例文本:
18 2131 Z50000 ZZ-AAA
PR
PR
AGM TPS P773QQ 1500 DCA 22FEB
21,77,23,M10,F,26,3100,2
OK
18 2134 Z50000 ZZ-AAA
PR
QU HMKKDBB
.DDVZAZC 182134
ARR
FI US1500/AN P773QQ/DA KDCA/AD KMIA/IN 2026/FB 152/LA /LR
DT DDL DCAV 182134 M33A
- OS KMIA /GNO6541/R200RR
18 2134 Z50000 ZZ-AAA
PR
PR
ARR OPN P773QQ 1500 DCA 22FEB
0757
OK
18 2135 Z50000 ZZ-AAA
PR
PR
ARR M58 P773QQ 1500 DCA 22FEB
212
UNKNOWN POL/SPOL
QU HMKKDBB
.DDVZAZC 182134
ARR
FI US1500/AN P773QQ/DA KDCA/AD KMIA/IN 2026/FB 152/LA /LR
DT DDL DCAV 182134 M33A
- OS KMIA /GNO6541/R200RR
18 2136 Z50000 ZZ-AAA
PRF 1500/18 MIA IN 0152 333
18 2137 Z50000 ZZ-AAA
PR
PRZ 1500/18 MIA IN 2026 N/A 333
我的目标是只获取中间有关键短语^ FI和^ DT的文本块。匹配组应仅包含两个块。从21 2134年开始到M33A结束,然后从18 2135结束到M33A。
我试过了:
这大部分都有效,除了它在前一个块开始匹配。
RegexOptions.Singleline Or RegexOptions.Multiline Or RegexOptions.IgnoreCase
^\d\d \d{4}(.*?)^FI US(.*?)^DT DDL(.*?)\r
这是我从另一个帖子中拿走的,但似乎无法绕过我的脑袋。它仅匹配每个块的第一部分。
RegexOptions.Multiline Or RegexOptions.IgnoreCase
^\d\d \d{4}.*\r[\s\S]*?(?=(?:^\d\d \d{4}|$))
有一段时间没有使用正则表达式所以任何帮助赞赏。
你可以用
(?ms)^\d\d +\d{4}\b(?:(?!^(?:\d\d +\d{4}\b|FI|DT)).)*?^(?:FI|DT).*?(?=^\d\d +\d{4}\b|\Z)
请参阅regex demo(尽管它是PCRE正则表达式测试,它在.NET中的工作方式相同)。
图案细节
(?ms)
- 开始一条线^
- 2位数字,1个或多个空格和4个数字作为整个单词\d\d +\d{4}\b
- 任何char,0+重复,尽可能少,不启动序列:一行开头,2位数,1个或多个空格和4个数字作为整个单词,或(?:(?!^(?:\d\d +\d{4}\b|FI|DT)).)*?
或FI
DT
- ^(?:FI|DT)
或FI
在一条线的开头DT
- 任何0+字符,尽可能少.*?
- 一个积极的前瞻,需要(?=^\d\d +\d{4}\b|\Z)
(一行开头,2位数,1个或多个空格和4个数字作为整个单词)或^\d\d +\d{4}\b
(字符串结尾)以立即匹配当前位置的右侧。如果启用了单行,这个正则表达式应该找到你需要的东西
\Z
说明:
[0-3]\d\s+[0-2]\d[0-5]\d.*?(FI.*?)\n(DT.*?)\n
日间小时和分钟检查
[0-3]\d\s+[0-2]\d[0-5]\d
ungreedy捕获,。包括换行符
.*?
第一组,FI线,直到换线
(FI.*?)\n
第二组,同样的交易