解析器api(不允许修改)给我这样形式的字符串:
var1 var2 \
var2continued var2continued \\\
var2continued
var3
var3continued \
var3continued
我想使用正则表达式分割此字符串,例如:
$1 = "var1";
$2 = "var2
var2continued var2continued \\
var2continued"
$3 = "var3
var3continued \
var3continued"
基本上,第一个变量是一个或多个空格之后的第一个非空格字,遇到空格时结束。
第二个变量从第一个变量之后的第一个非空格字符开始,直到行尾。如果最后一个字符是“ \”,则将下一行添加到第二个变量中(不要修剪当前行最后一个字符和“ \”之间的空白)。 “ \”不应捕获下一行,而应同时返回两个“ \”(无转义)。仅修剪最后一行的空白。
第三变量是第二变量之后的所有内容。
到目前为止,我已经能够提出这个正则表达式,该正则表达式仅适用于var2和var3的一行
$my_re = qr/\s+(\S+)\s+(\S+)\s+[\n](.*)/
$text =~ /$my_re/
/\s+ (\S+) \s+ (.*?[^\\]) \n (.*)/xs;
/s
修饰符使得它也与换行符匹配,这在这里很重要(通常不匹配)。.
修饰符使其忽略文字空间,因此我们可以使其更具可读性。
示例程序
/x
打印“ var1”---“ var2 \var2continued var2continued \\var2continued”---“ var3var3续var3continued”
use warnings;
use strict;
use feature 'say';
my $v =
q( var1 var2 \
var2continued var2continued \\\
var2continued
var3
var3continued \
var3continued);
$v =~ /\s+ (\S+) \s+ (.*?[^\\]) \n (.*)/xs;
say "\"$1\""; say '---';
say "\"$2\""; say '---';
say "\"$3\"";
输出
use strict; use warnings; my $str = do { local $/; <DATA> }; print "INPUT:\n[$str]\n"; $str =~ /(\w+)\s+(.*?\\\\\\\s*\w+)\n(.+)/s; #$str =~ /(\w+)\s+((?:.*?)\\\\\\\s+(?:\w+)?)\n(.+)/s; print "\n1: [$1]"; print "\n2: [$2]"; print "\n3: [$3]"; __DATA__ var1 var2 \ var2continued var2continued \\\ var2continued var3 var3continued \ var3continued
我最终将文本分割成多行。然后将其分为两部分(1和2一起以及3本身)。然后我将其分为第一部分。我的实际代码分为多个功能,但在下面进行了简化:
INPUT:
[ var1 var2 \
var2continued var2continued \\\
var2continued
var3
var3continued \
var3continued
]
1: [var1]
2: [var2 \
var2continued var2continued \\\
var2continued]
3: [var3
var3continued \
var3continued
]