RegEx忽略了定义的边界

时间:2019-05-07 10:50:09

标签: regex string replace

问题

我正在尝试从文本文件中检索信息,但正在努力检索“ Rationale”字段的内容: 确实,我的问题是我想忽略模式: List Paragraph \ txx)(用x表示数字)。 但是,有些行以 List Paragraph \ t(x)开头。 简而言之,如果列表段落\ t之后的字符不是“(”,我想忽略数字 xx),但是如果后面跟着“(”,则现在开始捕获。 (请参见下面的“预期结果”部分)

文本

List Paragraph  36) Rationale-1 - Details on the context:
List Paragraph  37) None.
Normal  
List Paragraph  38) 2 - Statement complements:
List Paragraph  39) Blablablabla
List Paragraph  (1) Blablablabla
List Paragraph  (2) Blablablabla
List Paragraph  (3) Blablablabla
List Paragraph  (4) Blablablabla
List Paragraph  (5) Blablablabla
List Paragraph  (6) Blablablabla
List Paragraph  (7) Blablablabla
Normal  
List Paragraph  40) Blablablabla
Normal  
List Paragraph  41) 3 - Statement justification:
List Paragraph  42) Blablablabla
Normal  
List Paragraph  43) Blablablabla
List Paragraph  44) Blablablabla
List Paragraph  45) Blablablabla
List Paragraph  46) Attached Files: Rationale-
Normal  

首先,我正在使用此正则表达式捕获“ Rationale-”之后的所有内容,直到“ List Paragraph \ t46)Attached Files:Rationale-”之前的最后一个字符:

^List\sParagraph\t\d+\)\sRationale-([\s\S]+?)(?=^List\sParagraph\t\d+\)\sAttached\sFiles:\sRationale-)

有了这个,我有以下内容:

1 - Details on the context:
List Paragraph  37) None.
Normal  
List Paragraph  38) 2 - Statement complements:
List Paragraph  39) Blablablabla
List Paragraph  (1) Blablablabla
List Paragraph  (2) Blablablabla
List Paragraph  (3) Blablablabla
List Paragraph  (4) Blablablabla
List Paragraph  (5) Blablablabla
List Paragraph  (6) Blablablabla
List Paragraph  (7) Blablablabla
Normal  
List Paragraph  40) Blablablabla
Normal  
List Paragraph  41) 3 - Statement justification:
List Paragraph  42) Blablablabla
Normal  
List Paragraph  43) Blablablabla
List Paragraph  44) Blablablabla
List Paragraph  45) Blablablabla

现在,我不知道如何获得预期的结果...

预期结果

1 - Details on the context:
None.

2 - Statement complements:
Blablablabla
(1)Blablablabla
(2)Blablablabla
(3)Blablablabla
(4)Blablablabla
(5)Blablablabla
(6)Blablablabla
(7)Blablablabla 

Blablablabla

3 - Statement justification:
Blablablabla

Blablablabla
Blablablabla
Blablablabla

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

一个选项可能是选择所需的所有内容并替换为空字符串:

^(?:.*?\bRationale-|Normal|List Paragraph\t(?:\d+\)[ \t]*)?)[ \t]*

Regex demo

  • ^字符串的开头
  • (?:非捕获组
    • .*?\bRationale-匹配任意char的0+倍,除换行符非贪婪外,并匹配单词边界和Rationale-
    • |
    • Normal$匹配Normal并断言字符串的结尾
    • |
    • List Paragraph\t匹配List Paragraph和制表符
    • (?:\d+\)[ \t]*)?可选部分,用于匹配1个以上的数字,)后跟0+倍的空格或制表符
  • )关闭非捕获组
  • [ \t]*匹配0+次空格或制表符

如果您想获得匹配项,则可以通过在模式末尾添加(.*)来捕获捕获组中的所有后续内容。

Regex demo

如果引擎支持\K忘记了当前匹配的内容,则可以在其后添加\K.*

Regex demo