正则表达式在开始和结束字符串之间提取并匹配包含结束字符串

时间:2018-01-06 05:36:36

标签: regex string pcre

问题

我有一个很长的非结构化文本,我需要提取文本组。

我有一个理想的开始和结束。

这是截断非结构化文本的示例:

more useless gibberish at the begininng...
separated by new lines...
START                                              Fund Class                                            Fund Number                                   Fund Currency
XYZ                                      XYZ                                           XYZ                                          USD

                                                                                                                                                                bunch of text with lots of newlines in between...                                              Closing                              11.11                                                1,111.11   111,111.11

more useless gibberish between the groups...
separated by new lines...

START                                              Fund Class                                            Fund Number                                   Fund Currency
XYZ                                      XYZ                                           XYZ                                          USD

The word START appears in the middle sometimes multiple times, but it's fine                                                                                                                                                             bunch of text with lots of newlines in between...                                              Closing                              22.22                                                2,222.22   222,222.22

more useless gibberish at the end...
separated by new lines...

我尝试了什么

在上面的示例中,我想提取出位于STARTClosing

之间的两组文字

我使用正则表达式成功完成了

/(?<=START)(?s)(.*?)(?=Closing)/g

这是结果https://regex101.com/r/vo7CLx/1/

怎么了?

不幸的是,我还需要提取包含Closing字符串的行的结尾。

如果您从regex101链接注意到第一场比赛中有Closing 11.11 1,111.11 111,111.11。第二场比赛中Closing 22.22 2,222.22 222,222.22

正则表达式不匹配。

有没有办法在单个正则表达式中执行此操作?所以即使包含数字的结尾标签也包括在内?

3 个答案:

答案 0 :(得分:1)

(START)(?s)(.*?)(Closing)(\s+((,?\d{1,3})+.\d+))+应该匹配您想要的所有内容see here

答案 1 :(得分:1)

试试这个正则表达式:

(?s)(?<=START)(.*?Closing(?:\s*[\d.,])+)

Click for Demo

<强>解释

  • (?s) - 单行修饰符,表示正则表达式中的.将与换行符匹配
  • (?<=START) - 找到紧靠START
  • 之前的位置的正面观察
  • (.*?Closing(?:\s*[\d.,])+) - 懒惰地匹配任何字符的0次出现,直到下一次出现单词Closing,然后是序列(?:\s*[\d.,])+
    • (?:\s*[\d.,])+ - 匹配空格后跟数字或.,的0次出现次数。最后的+表示我们必须将此子模式匹配1次或更多次

答案 2 :(得分:0)

你可以试试这个正则表达式,

START(.*)Closing(.*)(((.?\d{1,3})+.\d+)+.\d+.\d+.\d)\d

Output of the code