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]
我这辈子都无法用 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]