模式匹配两组模式

时间:2017-09-19 12:28:48

标签: regex

我一直在尝试创建一个正则表达式,该表达式将匹配两组模式之间的文本块但却无法这样做,最多我只得到一行文本。

文本块可以包含一系列" ####"或" ****"。重复次数是min 2

例如,块文本可能如下所示

************
test 1
test 2
test3
############
x1
x2
x3
############
a1
a2
a3
*****
b1
b2
b3
***********************
c1
c2
c3

######################

d1
d2
d3

正则表达式匹配组应该能够给我所有的块

结果需要如下所示:

Block1:

test 1
test 2
test3

block 2:

x1
x2
x3

Block 3:

a1
a2
a3

block 4:
b1
b2
b3

block 5:
c1
c2
c3

block: 6
d1
d2
d3

到目前为止我的努力看起来像这样:

正则表达式:^.*#{2,}\s*(.*)(?=$)|^.*\*{2,}\s*(.*)(?=$)

相关文字的小提琴:https://regex101.com/r/ghgNbs/1/

任何帮助都会非常棒!

1 个答案:

答案 0 :(得分:1)

您可以使用延迟点匹配模式与DOTALL修饰符看起来像

(?sm)^(?:!#{2,}|\*{2,})\s*(.*?)(?=^(?:!#{2,}|\*{2,})|\Z)

请参阅regex demo

<强>详情

  • (?sm) - DOTALL和MULTILINE模式
  • ^ - 开始一行(由于(?m)
  • (?:!#{2,}|\*{2,}) - !后跟2个或更多#,或2个或更多*个字符
  • \s* - 0+ whitespaces
  • (.*?) - 第1组(你需要的):任何0+字符,尽可能少
  • (?=^(?:!#{2,}|\*{2,})|\Z) - 需要的积极前瞻
    • ^ - 开始一行(由于(?m)
    • (?:!#{2,}|\*{2,}) - !后跟2个或更多#,或2个或更多*个字符
    • | - 或
    • \Z - 字符串结束。

但是,该模式将相当耗费资源,建议将其展开。我建议

(?m)^(?:!#{2,}|\*{2,})\s*(.*(?:\R(?!(?:!#{2,}|\*{2,})).*)*)

注意:这次没有DOTALL修饰符。请参阅regex demo

<强>详情

  • (?m)^(?:!#{2,}|\*{2,})\s* - 与上述相同
  • (.*(?:\R(?!(?:!#{2,}|\*{2,})).*)*) - 第1组(您的预期结果在此处):
    • .* - 除了换行符之外的任何0 +字符,尽可能多(整行)
    • (?:\R(?!(?:!#{2,}|\*{2,})).*)* - 零个或多个序列:
      • \R(?!(?:!#{2,}|\*{2,})) - 换行符(\R可能会替换为(?:\r\n?|\n)且类似),但未跟!和2 + # s或2 + * s
      • .* - 除了换行符之外的任何0 +字符,尽可能多(整行)