regex - Perl 正则表达式指定捕获的最大长度

标签 regex perl

我在 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/

相关文章:

ruby - 为什么我会看到这两个几乎相同的 Ruby 正则表达式模式的不同结果,为什么一个匹配我认为不应该匹配的内容?

regex - 使用 sed 删除非字母数字字符

regex - 来自 IF 语句正则表达式匹配的值 (Perl)

MySQL RegExp 错误地将重音字符与 utf8 字符集和二进制排序规则匹配

xml - 如何使用 XML::LibXML 获取节点的行号

perl - 当我在同一个散列上循环时,在 Perl 中从散列引用中删除一个键是否安全?为什么?

perl - 使用 Getopt::Long 在 perl 中控制参数

Perl 继承 - 子程序覆盖

c# - 解析 Lucene 查询语法并转义 CloudSearch

perl - 如何在 perl 中计算 "reliably"300 秒的时间?