我想为以下内容创建一个正则表达式。
我有一些类似以下的文字:
field = "test string";
type = INT;
funcCall(.., field, ...);
...
text = "desc";
field = "test string 1";
type = FLOAT;
funcCall(.., field, ...);
...
text = "desc 2";
field = "test string 2";
type = FLOAT;
funcCall(.., field, ...);
...
text = "desc 3";
.... keeps repeating
基本上,我正在尝试创建一个正则表达式,它将获取从第一个“field =”开始到第二个“field =”开始的所有文本。它必须跳过函数调用中使用的字段文本。
我目前有以下几点:
my @overall = ($string =~ m/field\s*=.*?/gis);
但是,这只是获取文本“field =”。没有“?”它获取从第一个一直到最后一个实例的所有数据。
我也试过:
my @overall = ($string =~ m/field\s*=.*field\s*=/gis);
但是,这将让我每隔一个实例就会得到我,因为它拥有第二个“字段=”字符串。有什么建议?
最佳答案
我能看到的最简单的方法是 split
$string
由 /^\s*field\s*=/
表达。如果我们想捕获 'field = '
文本的一部分,我们可以打破 look-ahead :
foreach ( split /(?=^\s*field\s*=)/ms, $string ) {
say "\$_=[\n$_]";
}
因此,它会在
'field'
的每一行的开头中断。是下一个非空格字符串,后跟任意数量的空格,后跟 '='
.输出是:
$_=[
field = "test string";
type = INT;
funcCall(.., field, ...);
...
text = "desc";
]
$_=[
]
$_=[
field = "test string 1";
type = FLOAT;
funcCall(.., field, ...);
...
text = "desc 2";
]
$_=[
]
$_=[
field = "test string 2";
type = FLOAT;
funcCall(.., field, ...);
...
text = "desc 3";
.... keeps repeating
]
几乎是我想要的。但是,它会在我们想要的捕获之间留下空行的伪影。我不确定如何摆脱它,所以我们将过滤掉所有空白字符串:
foreach ( grep { m/\S/ } split /(?=^\s*field\s*=)/ms, $string ) {
say "\$_=[\n$_]";
}
然后它产生:
$_=[
field = "test string";
type = INT;
funcCall(.., field, ...);
...
text = "desc";
]
$_=[
field = "test string 1";
type = FLOAT;
funcCall(.., field, ...);
...
text = "desc 2";
]
$_=[
field = "test string 2";
type = FLOAT;
funcCall(.., field, ...);
...
text = "desc 3";
.... keeps repeating
]
您可以与之合作。
关于regex - Perl:正则表达式获取重复模式之间的所有文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33355952/