正则表达式匹配文本块与中间的关键短语

时间:2018-03-21 15:05:50

标签: regex vb.net text grouping

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}|$))

Haven在一段时间内没有使用正则表达式,所以任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

您可以使用

(?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) - 多行和单行选项
  • ^ - 开始行
  • \d\d +\d{4}\b - 2个数字,1个或多个空格和4个数字作为整个单词
  • (?:(?!^(?:\d\d +\d{4}\b|FI|DT)).)*? - 任何不重复的char,0+重复,不会启动序列:行的开头,2位数,1个或多个空格和4个数字作为整个单词,或{ {1}}或FI
  • 一行
  • DT - ^(?:FI|DT)FI
  • DT - 任意0个字符,尽可能少
  • .*? - 需要(?=^\d\d +\d{4}\b|\Z)的正向前瞻(一行开头,两位数字,一个或多个空格和整个单词四位数)或^\d\d +\d{4}\b(字符串结尾) )立即匹配当前位置的右侧。

答案 1 :(得分:0)

如果启用了单行

,这个正则表达式应该找到你需要的东西

[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.*?)\n第一组,FI线,直到换行

(DT.*?)\n第二组,同一笔交易