我是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
如何解决这类“问题”
我该怎么做?只能通过正则表达式?
答案 0 :(得分:8)
它不一定是正则表达式,但在Perl中它非常方便:
my $str = "[ timestamp | integer | string ] Some other string here";
my ($timestamp, $integer, $string, $other)
= ($str =~ /\[(.*?)\|(.*?)\|(.*?)\](.*)/);
答案 1 :(得分:7)
你可以像Java一样:
String.substring
是substr
。String.lastIndexOf
是rindex
。String.trim
是sub 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
,依此类推。