我如何将可变的多行perl正则表达式与不同的规则进行匹配

问题描述 投票:0回答:3

解析器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/

regex perl pcre
3个回答
2
投票
[第一个字,然后是直到换行符的所有内容,紧跟着一个非斜杠;然后其他所有

/\s+ (\S+) \s+ (.*?[^\\]) \n (.*)/xs;

/s修饰符使得它也与换行符匹配,这在这里很重要(通常不匹配)。 .修饰符使其忽略文字空间,因此我们可以使其更具可读性。


示例程序

/x

打印

“ var1”---“ var2 \var2continued var2continued \\var2continued”---“ var3var3续var3continued”


1
投票
尝试下面的代码(我来解决这个问题)

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


0
投票
没有一个答案适用于所有情况(2和3是可选的)。我遇到了一个小问题,解析器在反斜杠后添加了空间。

我最终将文本分割成多行。然后将其分为两部分(1和2一起以及3本身)。然后我将其分为第一部分。我的实际代码分为多个功能,但在下面进行了简化:

INPUT: [ var1 var2 \ var2continued var2continued \\\ var2continued var3 var3continued \ var3continued ] 1: [var1] 2: [var2 \ var2continued var2continued \\\ var2continued] 3: [var3 var3continued \ var3continued ]

© www.soinside.com 2019 - 2024. All rights reserved.