我一直在尝试创建一个正则表达式,该表达式将匹配两组模式之间的文本块但却无法这样做,最多我只得到一行文本。
文本块可以包含一系列" ####"或" ****"。重复次数是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/
任何帮助都会非常棒!
答案 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 +字符,尽可能多(整行)