gpt4 book ai didi

regex - Perl:正则表达式获取重复模式之间的所有文本

转载 作者:行者123 更新时间:2023-12-04 23:18:41 24 4
gpt4 key购买 nike

我想为以下内容创建一个正则表达式。

我有一些类似以下的文字:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com