我有一份文件,我想要复制组。开始文档和结束文档,例如
大胆* Lorem ipsum dolor坐下来,精神上的adipistur elit。 Vestibulum vitae dapibus tortor。 Duis odio massa,viverra quis vestibulum nec,tincidunt ac tellus。 * bold
Ut id enim sapien,ut varius dolor。 Curabitur ipsum dolor,consectetur quis fermentum ut,
bold * aliquam nec felis。 Praesent sed malesuada sem。 Integer cursus lectus ac eros aliquet rutrum。 * bold
我只想匹配lorem ipsum直到tellus,丢弃中间线,并将aliquam匹配到rutrum,我怎么能这样做?
答案 0 :(得分:1)
从与您关注的作品匹配的表达式开始:
/lorem ipsum(.*?)tellus(.*?)aliquam(.*?)retrum/
现在连接在一起的第一个和第三个子模式是你的最终内容。
在某些正则表达式中你可以得到不计算的中间子模式 - 在Perl的味道(和PHP的preg)中它是(?:.*?)
。
答案 1 :(得分:1)
如果您想要的组总是以块分隔,例如示例中的段落,您可以找到该块的所有实例,可能使用换行作为结束项,然后显示第一个和最后一个编号匹配。
或者您是否需要实际的RegEx来匹配这些块?如果是这样,首先我建议使用http://rubular.com/来测试RegEx的内容,因为它实时可以让您更容易看到事情是如何影响它的。
知道你正在使用什么语言,或者如果它是一种cli类型的搜索,例如egrep,将有助于答案。
答案 2 :(得分:1)
在Perl中,你可以这样做:
#!/usr/bin/perl
use 5.10.1;
use warnings;
use strict;
my $str = q!Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum vitae dapibus tortor. Duis odio massa, viverra quis vestibulum nec, tincidunt ac tellus.
Ut id enim sapien, ut varius dolor. Curabitur ipsum dolor, consectetur quis fermentum ut,
aliquam nec felis. Praesent sed malesuada sem. Integer cursus lectus ac eros aliquet rutrum.!;
$str =~ /\A(.+)[\s\S]+?(.+)\Z/;
say '$1 = ',$1;
say '$2 = ',$2;
输出:
$1 = Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum vitae dapibus tortor. Duis odio massa, viverra quis vestibulum nec, tincidunt ac tellus.
$2 = aliquam nec felis. Praesent sed malesuada sem. Integer cursus lectus ac eros aliquet rutrum.
说明:
/ : begin of regex
\A : begining of string
( : begining of group 1
.+ : any char except newline one or more time
) : end of group 1
[\s\S] : any char including newlines
+? : one or more time non greedy
( : begining of group 2
.+ : any char except newline one or more time
) : end of group 2
\Z : end of string
/ : end of regex
当然,这可以适应其他语言。
答案 3 :(得分:0)
如果你正在寻找第一行和最后一行(不清楚(至少对我而言)你的第一部分和最后部分是什么意思),以下正则表达式将捕获$1
中的第一行和最后一行$2
(前提是至少有两行)
\A([^\n]+)[\s\S]+([^\n]+)\Z