我们如何在Perl中提取字符串的一部分?

时间:2013-05-28 18:42:50

标签: regex string perl

我是Perl的新人。我有一个这种格式的字符串:
[ timestamp | integer | string ] Some other string here

示例字符串:

[ 2013/05/28 21:39:02 | 2212 | MALFUNCTION  ] Please check for malfunction

timestamp实际上是一个时间戳,例如2013/05/28 20:38:02
整数是一个数字,字符串可以是一系列单词中的特定单词 我有兴趣提取这部分的字符串部分。

Java我会这么简单:

String s = sentence.substring(line.lastIndexOf("|") + 1, line.lastIndexOf("]")).trim();  

这只是逐字符串地循环字符串并获得感兴趣的部分 但我不知道Perl如何解决这类“问题” 我该怎么做?只能通过正则表达式?

5 个答案:

答案 0 :(得分:8)

它不一定是正则表达式,但在Perl中它非常方便:

my $str = "[ timestamp | integer | string ] Some other string here";
my ($timestamp, $integer, $string, $other)
   = ($str =~ /\[(.*?)\|(.*?)\|(.*?)\](.*)/);

答案 1 :(得分:7)

你可以像Java一样:

  • String.substringsubstr
  • String.lastIndexOfrindex
  • String.trimsub trim { my $s = $_[0]; $s =~ s/^\s+//; $s =~ s/\s+\z//; $s }
  • +.

但该方法找到最后的|],而不是第二个和下一个。如果这些字符中的任何一个在字符串中稍后出现,它将失败。我用

my ($ts, $i, $s, $rest) =
   map trim($_),
      /^\[ ([^|]*) \| ([^|]*) \| ([^\]]*) \] (.*)/sx;

答案 2 :(得分:3)

如果您匹配的字符串不包含其他竖线,则可以使用正则表达式:

$fullstring = '[ timestamp | integer | string ] Some other string here';
($string) = ($fullstring =~ /\| *([^|\]]*?) *]/);

答案 3 :(得分:2)

正则表达式是一种自然的Perl-ish方式。在这种情况下,我们希望最后一个'|'之间的字符串和第一个']',减去它周围的任何空格。

my $string = ($line =~ m/
    \|  #The | character
    \s* #Arbitrary whitespace
    (   #Capture
        [^\|\]]*? #Some number of characters that are not | or ]
    )
    \s* #More whitespace
    \]  # The ] character
    /x)[0];

成语(m/(reg)ex/)[0]用于从正则表达式中提取第一个捕获组。否则,返回一组捕获组并将其转换为标量(数组的长度)。

正则表达式上的/x修饰符会导致空格和#comments被忽略。

正则表达式中的*?标记表示“非贪婪”匹配。否则,也将捕获尾随空格。

答案 4 :(得分:1)

可以通过拆分|[]字符,然后修剪提取值的空格来解析行

my @arr = map { s/^\s+ | \s+$//xg; $_ }  split / [\Q[]|\E] /x, $line;

之后$arr[0] timestamp $arr[1]integer,依此类推。