使用重复的分隔符标记部分的开始和结束

时间:2014-11-10 21:11:07

标签: regex

我没有正则表达式专家,但我有同事将我视为一个并请求我帮助解决他们的正则表达式问题。今天这个让我很难过,而且我认为它应该没有。 (我不确切知道同事正在使用什么样的正则表达式,所以我猜任何常见的正则表达式格式都可以做出答案!)

如何提取由它们之间的单个分隔符分隔的数据部分?这可以在一个正则表达式中完成吗?例如:

**********
some data
here
**********
is broken into
*sections* by
**********
the repeated
**********
blocks of asterisks
**********

它的分隔符为"**********"\*{10}),全局正则表达式应返回值["some data\nhere", "is broken into\n*sections* by", "the repeated", "blocks of asterisks"]

我可以通过以下方式轻松获得 something that matches 交替的块

/(?:^|\n)\*{10}\n([\s\S]*?)\n\*{10}(?:\n|\$)/g
//=> ["some data\nhere", "the repeated"]

但是第一场比赛"用完了#34;分隔符的第二个实例,它不可用作第二个实例的开头。

有一种简单的正则表达式吗?

2 个答案:

答案 0 :(得分:1)

嗯......最简单的方法是拆分\*{10,},但如果你的工具不能让你这样做,你可以尝试以下方法:

\s*\*{10,}\s*(*SKIP)(*FAIL)|(?:.(?!\*{10}))+

Demo

既然你让我们在答案中使用任何风格,那就是Perl / PCRE唯一的正则表达式。

或者如果您需要更简单的语法:

(?:\*{10,}\s*)?((?:.(?!\*{10}))+)

Demo。结果位于$1

答案 1 :(得分:1)

也许是这样的

(?s:(?:\*{10}|.)(.*?)\*{10}|(.*?)\*{10}|(.*?))

虽然我不确定你想要哪种格式。拟议的正则表达式将令牌投入第1组。

干杯!