我正在解析一个文本文件,我在下面显示的表单中得到了多行。
然后我尝试将每一行拆分为三个段:Part1:sf;第2部分:名称;第三部分:方向
但是现在我在如何编写正则表达式方面遇到了困难。我曾考虑过在空格上拆分并使用数组来连接新字符串:
S15,F49 Large Recipe Download Request (LRDR) S,H->E,reply
my ($sf, $name, $direction) =~ / I don't know how to implement here/
如何获得$ sf = S15,F49
//其他行S1,F11
; S6,F1
;等
$ name = Large Recipe Download Request (LRDR)
//不同的$ sf的不同名称。
$ direction = S,H->E,reply;
//某段时间M,H<-E,reply
或S,H<->E
或S,H->E,[reply]
等。第3部分的每个子项目之间没有空格: $方向
答案 0 :(得分:4)
如果$sf
和$direction
项目中没有空格,那么您可以将以下代码应用于每一行:
if ($subject =~ m/^(\S+)\s+(.*?)\s+(\S+)$/) {
$sf = $1;
$name = $2;
$direction = $3;
} else {
// no match found
}
<强>解释强>
^
:将正则表达式锚定在字符串的开头。
(\S+)
:匹配一个或多个非空格字符。在$1
中捕获匹配项。
\s+
:匹配一个或多个空格字符(=分隔符到下一个项目)。
(.*?)
:匹配任意数量的字符,尽可能少但仍允许整体匹配成功,并在$2
中捕获。*
\s+(\S+)
:与上述类似 - 匹配空格分隔符和非空格字符 - &gt; $3
。
$
:将搜索锚定在字符串的末尾。
*延迟量词*?
的原因是否则,正则表达式的这一部分也会捕获除最后一个之外的所有以下空格分隔符。
答案 1 :(得分:2)
my $str = "S15,F49 Large Recipe Download Request (LRDR) S,H->E,reply";
$str =~ /^([^\s]+) # sf: anything except whitespace until first whitespace
\s+
(.+) # name: anything
\s+
([^\s]+)$ # direction: anything except whitespace, from last
# whitespace to the end
/x;
my ($sf, $name, $direction) = ($1, $2, $3);
print $sf, "\n", $name, "\n", $direction, "\n";
答案 2 :(得分:1)
根据您的展示,这应该有效:
my ( $sf, $name, $direction ) = split /\s{2,}/, $line;
拆分更多两个或更多空格。
这将自动扼杀:
my ( $sf, $name, $direction ) = split /\s{2,}|\n/, $line;