Perl 正则表达式匹配定界字符串

Perl Regex match delimited string

我这辈子都无法用 Perl 语法解决这个问题。我设法让这种风格在 Javascript 中发挥作用,其中 N 是匹配号。

^(?:[^\|]*\|){N}([^\|]*)

我也试过匹配任何不是管道的东西,但是我似乎无法编写正则表达式来提取我需要的 Perl 风格的匹配索引。有什么指点吗?

数据看起来像这样

astring| another string|test|maybe some more text

当第一个正则表达式 运行 出现在正则表达式调试器中时,它会生成这个(这是我想要的 运行)。

^(?:[^\|]*\|){0}([^\|]*) produces 'astring' ^(?:[^\|]*\|){3}([^\|]*) produces 'maybe some more text'

然而,当我在 Netezza(Perl Regex,这是我需要它的地方 运行)中 运行 它产生:

^(?:[^\|]*\|){0}([^\|]*) produces 'astring' ^(?:[^\|]*\|){3}([^\|]*) produces 'astring| another string|test|maybe some more text'

更新: 问题解决了 Regex 没问题,但是我是个笨蛋,没有正确使用 Netezza 中的功能。这导致了正则表达式的过度复杂化。下面的示例 REGEXP_EXTRACT(column, '[^\|]+',1 ,4 )

我想你可以重复 [^\|] 1 次或更多次 [^\|]+

^(?:[^\|]+\|){N}([^\|]+)

^(?:[^\|]+\|){0}([^\|]+) 将在组 1 中捕获 astring

^(?:[^\|]+\|){3}([^\|]+) 将在组 1 中捕获 maybe some more text

当你的数据被分隔时,你想要的工具不是神奇的正则表达式,而是拆分:

#!/usr/bin/env perl

use strict;
use warnings;

my $target_field = 3;
my $str = "astring| another string|test|maybe some more text";

print +(split (/\|/, $str))[$target_field]