代码之家  ›  专栏  ›  技术社区  ›  sinDizzy

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

  •  1
  • sinDizzy  · 技术社区  · 6 年前

    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在中间。匹配组应仅包含两个块。从18 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}|$))
    

    已经有一段时间没有使用regex了,非常感谢您的帮助。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Wiktor Stribiżew    6 年前

    您可以使用

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

    请参见 regex demo (虽然这是一个PCRE regex测试,但在.NET中也会起到同样的作用)。

    图案详细信息

    • (?ms) -多行和单行选项
    • ^ -线路起点
    • \d\d +\d{4}\b -2个数字、1个或多个空格和4个数字组成一个完整的单词
    • (?:(?!^(?:\d\d +\d{4}\b|FI|DT)).)*? -任何字符,0+重复,尽可能少,不开始序列:一行开头,2个数字,1个或多个空格,4个数字作为一个完整的单词,或 FI DT
    • ^(?:FI|DT) - 金融机构 DT公司 在一行的开头
    • .*? -任何0个以上字符,尽可能少
    • (?=^\d\d +\d{4}\b|\Z) -积极的前瞻性要求 ^\d\d +\d{4}\b (一行开头,2个数字,1个或多个空格,4个数字组成一个完整的单词)或 \Z (字符串结尾)立即匹配到当前位置的右侧。
        2
  •  0
  •   Lance Toth    6 年前

    如果启用单行,这个正则表达式应该可以找到您需要的内容

    [0-3]\d\s+[0-2]\d[0-5]\d.*?(FI.*?)\n(DT.*?)\n

    说明:

    [0-3]\d\s+[0-2]\d[0-5]\d 每日小时和分钟检查

    .*? 取消冻结捕获。包括换行符

    (FI.*?)\n 第一组,FI线,直到断线

    (DT.*?)\n 第二组,相同的交易