【问题标题】:Regex to capture text not beginning with number but containing number正则表达式捕获不以数字开头但包含数字的文本
【发布时间】:2015-09-18 06:45:53
【问题描述】:

我正在编写一个 perl 脚本,其中一部分是捕获不以数字开头的数据。我试过(\w)\s+(\d+)\s+(\S+)\s+(\d.+)。以下是文件的一些部分(太大,无法将所有行都放在这里)。

我要捕捉的文字是

BBACCap            8            N/A           48,46,44,42,40,38,36,34,32,

或者可以是

IG-XL_DataTool     N/A          N/A           N/A

或

DC-30              1            N/A           1,0

正则表达式确实与我需要的上述数据匹配,但是我也在捕获数据(我不想要),例如

1       2
2       3, 4

还有(我不想要的)

1.0     BBAC-15     805-004-50 0301B5C5 0829-E 5445
    aka: 805-004-02,805-004-03

但只有上面的E 5445 aka: 805-004-02,805-004-03。

有什么帮助吗?

【问题讨论】:

标签: regex perl


【解决方案1】:

很难确定你需要什么,但看起来你可以在空白处分割每一行并只选择前三个字段,拒绝任何第一个字段以十进制数字开头的行

这是一个从命令行指定的文件中读取的演示

while ( <> ) {
    my @fields = split;
    next if $fields[0] =~ /^[0-9]/;

    print "@fields[0..2]\n";
}

【讨论】:

  • 更简洁,while(&lt;&gt;) { my @fields = split; print "@fields\n" if $fields[0] !~ /^\d/; }
  • 甚至perl -Ane 'print if $F[0] !~ /^\d/' file
  • @DavidHammen:这种替代方案存在问题。首先,真正的代码不可能只对过滤的文件记录执行一条语句,因此不能使用if的语句修饰符形式,除非我们也将语句括在do块中,这很不整洁。其次,\d 字符类包括许多非 ASCII Unicode 字符以及十进制数字,因此[0-9] 更安全,除非您将\d 与/a 一起使用ASCII-safe正则表达式修饰符,需要 5.14 或更高版本的 Perl
  • @tripleee:正如我所提到的,print 只是我自己的想象,OP 很可能希望为每个匹配的行执行多个语句。此外,只有前三个字段是有意义的,因此打印整行不会满足要求。也许say "@F[0..2]" 可以接受
  • 我已经尝试过@stribizhev 在问题的 cmets 中建议的解决方案。它有些如何不将最后一个(第三个)参数(带有 csv 的参数)写入文件。它在某个不存在的行号处给出了Use of uninitialized value $_ in concatenation(当我只有 149 行时为 300+)。这是我的current code,以防您想查看它。不确定它是否没有捕获或其中的逻辑错误。编辑:我更改了链接,如果您想查看写入文件的其中一行,请查看最后一行。
猜你喜欢
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2015-02-26
  • 1970-01-01
相关资源
最近更新 更多