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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式匹配文本块与中间的关键短语相关的知识,希望对你有一定的参考价值。

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
^dd  d{4}(.*?)^FI US(.*?)^DT DDL(.*?)

这是我从另一个帖子中拿走的,但似乎无法绕过我的脑袋。它仅匹配每个块的第一部分。

RegexOptions.Multiline Or RegexOptions.IgnoreCase
^dd  d{4}.*
[sS]*?(?=(?:^dd  d{4}|$))

有一段时间没有使用正则表达式所以任何帮助赞赏。

答案

你可以用

(?ms)^dd +d{4}(?:(?!^(?:dd +d{4}|FI|DT)).)*?^(?:FI|DT).*?(?=^dd +d{4}|)

请参阅regex demo(尽管它是PCRE正则表达式测试,它在.NET中的工作方式相同)。

图案细节

  • qazxsw poi - 多线和单线选项
  • (?ms) - 开始一条线
  • ^ - 2位数字,1个或多个空格和4个数字作为整个单词
  • dd +d{4} - 任何char,0+重复,尽可能少,不启动序列:一行开头,2位数,1个或多个空格和4个数字作为整个单词,或(?:(?!^(?:dd +d{4}|FI|DT)).)*?FI
  • DT - ^(?:FI|DT)FI在一条线的开头
  • DT - 任何0+字符,尽可能少
  • .*? - 一个积极的前瞻,需要(?=^dd +d{4}|)(一行开头,2位数,1个或多个空格和4个数字作为整个单词)或^dd +d{4}(字符串结尾)以立即匹配当前位置的右侧。
另一答案

如果启用了单行,这个正则表达式应该找到你需要的东西



说明:

[0-3]ds+[0-2]d[0-5]d.*?(FI.*?) (DT.*?) 日间小时和分钟检查

[0-3]ds+[0-2]d[0-5]d ungreedy捕获,。包括换行符

.*?第一组,FI线,直到换线

(FI.*?) 第二组,同样的交易

以上是关于正则表达式匹配文本块与中间的关键短语的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配特定长度的字符串,中间有空格(任何地方)

易语言正则表达式中,如何匹配多个关键词,例如我要在“你好我是地球人”中匹配“好”和“地”

使用带有 \b 的正则表达式来匹配字符串中的不同短语[重复]

PHP正则表达式取文本中间内容。

易语言如何用正则表达式来读取制定的网页文本 最好源码上,谢谢

PYTHON笔记简单的网页爬虫:用正则表达式抓取关键信息