0

假设我有以下测试字符串:

Start_Get_Get_Get_Stop_Start_Get_Get_Stop_Start_Get_Stop

其中 _ 表示任何字符,例如:StartaGetbbGetcccGetddddStopeeeeeStart....

我要提取的是开始和停止分隔符中最后一次出现的 Get 单词。这里的结果将是下面的三个粗体 Get。

Start__Get__Get__ Get __Stop__Start__Get__ Get __Stop__Start__ Get __Stop

我确切地说我只想使用正则表达式并尽可能一次通过。

欢迎任何建议

谢谢'

4

5 回答 5

1
Get(?=(?:(?!Get|Start|Stop).)*Stop)

我假设您的StartStop分隔符将始终保持适当的平衡,并且它们不能嵌套。

于 2010-07-26T20:05:23.673 回答
0

像这样的东西,也许:

(?<=Start(?:.Get)*)Get(?=.Stop)

这需要可变长度的后向支持,并非所有正则表达式引擎都支持。通过将第一个更改为或类似
,可以使其具有最大长度,更多(但仍不是全部)支持。*{0,99}

此外,在前瞻中,可能.应该是 a.+.{1,2}取决于双下划线是否是错字。

于 2010-07-26T13:45:14.043 回答
0

使用 Perl,我会这样做:

my $test = "Start_Get_Get_Get_Stop_Start_Get_Get_Stop_Start_Get_Stop";
$test =~ s#(?<=Start_)((Get_)*)(Get)(?=_Stop)#$1<FOUND>$3</FOUND>#g;
print $test;

输出:

Start_Get_Get_<FOUND>Get</FOUND>_Stop_Start_Get_<FOUND>Get</FOUND>_Stop_Start_<FOUND>Get</FOUND>_Stop

你应该适应你的正则表达式风格。

于 2010-07-26T14:27:39.797 回答
0

我会通过两次传球来完成它。第一遍找到单词“Get”,第二遍计算它出现的次数。

于 2010-07-26T13:15:43.117 回答
0
$ echo "Start_Get_Get_Get_Stop_Start_Get_Get_Stop_Start_Get__Stop" | awk -vRS="Stop" -F"_*" '{print $(NF-1)}'
Get
Get
Get
于 2010-07-26T13:15:51.603 回答