繁体   English   中英

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

[英]How do we extract parts of a string in 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中解决这种“问题”。
我该怎么做? 只能通过正则表达式?

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

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

你可以像Java一样做:

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

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

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

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

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

正则表达式是一种自然的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被忽略。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM