2009-01-20 81 views
0

我有一个文本,我需要采取定义模式的内容。 MARK1MARK2之间的内容以及之后的内容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 

回答

1

这将是:

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

至少,它适用于正则表达式教练对你的测试用例。
当然,你需要迭代每场比赛。
请注意,它可能不适用于所有类型的正则表达式:例如,JavaScript没有前瞻断言。

+0

完美。那是它 – 2009-01-20 21:43:35

0

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

0

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

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

我做了你要如何处理空间,这我知道大概只相一致,让您的例子情况下更容易阅读一些武断的假设。

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; 

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