将多重匹配与由定义标记分隔的正则表达式进行匹配

时间:2009-01-20 21:11:32

标签: regex

我有一个文本,我需要以定义的模式获取内容。 MARK1 MARK2 之间的内容以及 MARK2 之后的内容。但是,这些标记可以重复,我需要将它们全部发生。在下面的示例中:

text: "textA textB _MARK1_ textC _MARK2_ textD _MARK1_ textE textF _MARK2_ textG textH textI"

array(0): _MARK1_ textC _MARK2_ textD 
array(1): textC
array(2): textD
array(3): _MARK1_ textE textF _MARK2_ textG textH textI 
array(4): textE textF
array(5): textG textH textI

4 个答案:

答案 0 :(得分:1)

那将是:

/(_MARK1_(.*?)_MARK2_((?:(?!_MARK1_).)*))/g

至少,它适用于您的测试用例的RegEx Coach 当然,你需要对每场比赛进行迭代 请注意,它可能不适用于所有版本的正则表达式:例如,JavaScript没有前瞻性断言。

答案 1 :(得分:0)

我认为你不能用一个表达式实现这个目标。可能你需要将它分解为初始表达式,然后循环以对第一个匹配的每次迭代执行第二次表达式匹配。

答案 2 :(得分:0)

我错过了什么或者这是你在找什么?

/(_MARK1_ (.*?) _MARK2 (.*?))*/

我对你如何处理空格做了一些任意的假设,我发现这可能只是使你的例子更具可读性。

答案 3 :(得分:0)

我不确定你的阵列中是否真的需要分隔标记。除非你有特定的规格,否则这部分似乎是多余的。此解决方案假设您并不真正需要它。既然你没有指定语言,Perl怎么样?

use Data::Dumper;
my $text = 'textA textB _MARK1_ textC _MARK2_ textD _MARK1_ textE textF _MARK2_ textG textH textI';
my @results = $text =~ m/(?<=_MARK1_|_MARK2_)(.*?)(?=_MARK1_|_MARK2_|$)/g;
print Data::Dumper::Dumper @results;

但是,没有理由尝试使用正则表达式的一般情况。改为使用解析器。