如何仅使用正则表达式

时间:2019-08-08 23:22:53

标签: regex

我正在尝试使用正则表达式在2个特定单词之间提取数字。问题在于它们是多行的。我正在尝试从PDF中提取这些内容,因此它只能在这两个词之间

WORD1:
(23)
(56)
(78)
END

我尝试了这个 \((.*?)\),它拉出()之间的数字,但我需要它仅在单词 WORD1 END 之间搜索,而不是整个PDF。 有办法吗?

Expected Output:
    23
    56
    78

3 个答案:

答案 0 :(得分:1)

使用\G构造

(?s)(?:(WORD1:)(?=(?:(?!WORD1:|END).)*?\d(?:(?!WORD1:|END).)*END)|(?!^)\G)(?:(?!\d|WORD1:|END).)*?\K\d+

https://regex101.com/r/il00WG/1

解释

 (?s)                          # Dot-all inline modifier
 (?:
      ( WORD1: )                    # (1), Flag start of new set 
      (?=                           # Lookahead, must be a digit before the END
           (?:
                (?! WORD1: | END )
                . 
           )*?
           \d 
           (?:
                (?! WORD1: | END )
                . 
           )*
           END
      )
   |                              # OR,
      (?! ^ )
      \G                            # Start where last match left off
 )
 (?:
      (?! \d | WORD1: | END )       # Go past non-digits
      . 
 )*?
 \K                            # Ignor previous match up to here
 \d+                           # Digits, the only match

答案 1 :(得分:0)

您需要在正则表达式中包含全局修饰符 gm ,以符合您的需要。

https://regex101.com/r/c3VLdq/1

(\(.*?\))/gm

m用于多行

m 修饰符:多行。使^和$匹配每行的开始/结束

答案 2 :(得分:0)

我有一个类似的问题,我使用的是LookAhead(?=)和LookBehind(?<=) 因此,在您的情况下,它看起来像这样(如果支持Lookbehind)

(?<= WORD1:\ n)(。* \ n)+(?= END) 注意WORD1之后的新行符号:如果省略该符号,您将从换行符开始获得结果

在这里测试 https://regex101.com/r/qxPQqq/4