[英]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.substring
是substr
。 String.lastIndexOf
是rindex
。 String.trim
是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 }
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.