我在 Perl 中有一个像这样的正则表达式:
\s{2,}(?<name>(\S+\s)*\S+)\s{2,}
有没有办法可以验证正则表达式中命名捕获 $+{name}
的长度?
我只想匹配具有最大提供长度的值。
例如,我希望 $+{name}
最多为 27 个字符。
我认为这种情况可以使用lookarounds来完成,但我还不太熟悉这种方法。
这是一个例子:
我有这些数据:
ROTINSON, JABON 0.000
CHUNG, TSONH-HIW 0.000
ROBINSONS, VISTOR R 0.000
您可以看到的名称将与 ((\S+\s)*\S+) 匹配,并且我希望我的正则表达式能够捕获(如果可能的话)正好 27 个字符,因为我认为这是该列需要的最大长度.
您看到的数字应该位于不同的列中,我想准确地找到必须在一列中添加哪个值,依此类推。该文件不是固定宽度的文件,因此并非所有值都由相同数量的空格精确分隔。会有一些小的变化。
到目前为止,我在比赛中使用了它,但没有按照我想要的方式工作:
/^\s{0,8}(?P<name>(\S+\s){0,5}\S+)
\s{10,70}(?P<value>\d+\.\d+)
\s*$/xi
最佳答案
正则表达式并不是包治百病的 Elixir ,在这种情况下它们是错误的选择。您应该将字符串拆分为多个空格字符,并拒绝超长的子字符串。
这个程序演示了它:
use strict;
use warnings;
use 5.010;
my $st = ' aaa aa aa 2long 2long 2long 2long 2long bb bbb bb cc cc ccc ';
say for grep { $_ and length $_ <= 27 } split /\s{2,}/, $st;
输出
aaa aa aa
bb bbb bb
cc cc ccc
关于regex - Perl 正则表达式指定捕获的最大长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18848999/