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

标签 regex perl parsing regexp-grammars

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

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

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/

相关文章:

windows - 如何识别 Perl 字符串中的 Windows 文件路径?

arrays - Perl:如何解释数组和标量的否定?

JavaScript - 使用回车符和换行符解析 JSON

regex - 将 python 字符串中的所有十六进制编码替换为等效的 ascii 值

regex - 如何使用 Bash 从 JSON 字符串中删除\n 和\r?

regex - 您在正则表达式中使用过 Perl 5.10 回溯控制动词吗?

perl - 如何更新散列属性,更新 Perl Moose 中的其他散列属性

css - 将父 ID 添加到大 css 文件中

parsing - 如何使用 Parsec 通过特定字符串分隔字符串

android - WKT中如何处理Circle?