正则表达式读取id

时间:2015-02-04 07:20:24

标签: regex perl

我的日志文件包含以下内容:

 (2947:_dRW00T3WEeSkhZ9pqkt5dQ) ---$ ABC XY "Share" 16-Sep-2014 03:22 PM
 (2948:_3nFSwz3TEeSkhZ9pqkt5dQ) ---$ ABC XY "Share" 16-Sep-2014 03:05 PM
 (2949:_voeYED3AEeSkhZ9pqkt5dQ) ---$ ABC XY "Initial for Re,oved" 16-Sep-2014 12:44 PM

我想从每一行读取唯一ID id _dRW00T3WEeSkhZ9pqkt5dQ并将其存储在一个数组中。 我目前的代码是:

while(<$fh>) {
            if ($_ =~ /\((.*?)\)/) {
                push @cs_ids , $1;
            }
        }

3 个答案:

答案 0 :(得分:2)

试试这个:

    while(<$fh>) {
        if ($_ =~ /\(\d+:(.+?)\)/) {
            push @cs_ids , $1;
        }
    }

正则表达式检查以(开头的所有字符串,然后检查一个或多个数字是一个双点而不是一个或多个字符(将存储在$1中)。字符串的结尾是)

答案 1 :(得分:0)

你快到了那里:

perl -e '$string = "(2947:_dRW00T3WEeSkhZ9pqkt5dQ)"; if ($string =~ /^\((\d+:)(.*?)\)$/) { die $2; }'
_dRW00T3WEeSkhZ9pqkt5dQ at -e line 1.

将正则表达式条件更改为:

/^\((\d+:)(.*?)\)$/

这样做是匹配并将4位数和冒号分组为特殊的var $ 1和你想要的id为特殊的var $ 2.

答案 2 :(得分:0)

如果日志文件的每一行都保证有一个ID字符串,那么你可以只写

while (<$fh>) {
  /:(\w+)/ and push @cs_ids , $1;
}

\w(“word”)字符类匹配字母数字字符或下划线,这个正则表达式只是阻塞冒号后面的第一个单词字符序列。如果可能的话,最好避免使用非贪婪的修饰符,因为它是一个草率的规范,并且可能比简单的多字符匹配慢得多。