2009-12-22 121 views
0

你能帮我纠正我的解析代码。复杂的行解析 - 需要帮助

constant fixup privite ConfigAlarms = <U1 0>   /* comment here*/ 

滑的我下面的代码, 我不知道怎么弄的U10**/* comment here*/**值。

if(/^\s*(constant)\s*(fixup|\/\*fixup\*\/|)\s*(private|)\s*(\w+)^ ...(Need help here.) 
{ 
    $name1 = $1; # for content 
    $name2 = $2; # for fixup 
    $name3 = $3; # for privite 
    $name4 = $4; # for ConfigALarms 
    $name5 = $5; # for U1 
    $name6 = $6; # for 0 
    $name7 = $7; # for /* comment here*/ 

谢谢您的指导

更新完成的代码

if(/^\s*(constant)\s*(fixup|\/\*fixup\*\/|)\s*(private|)\s*(\w+)\s+=\s+<([a-zA-Z0-9]+)\s+([0-9]+)>\s*\/\*\s*(.*?)\s*\*\/(\r|\n|\s)/) 

回答

2

把你输入:

constant fixup privite ConfigAlarms = <U1 0>   /* comment here*/ 

,并开始与正则表达式替换变量而留下常数单独(你也需要逃避Perl的东西):

constant fixup privite (\w+) = <([a-zA-Z0-9]+) ([0-9]+)>   \/\* (.*?) \*\/ 

然后你可以把它对着空间健壮:

constant\s+fixup\s+privite\s(\w+)\s+=\s+<([a-zA-Z0-9]+)\s+([0-9]+)>\s+\/\*(.*?)\*\/ 

你的变量现在在$ 1,$ 2,$ 3,

+0

\ s +/*(。*?)* /无法用于评论部分。我改为(从下面的ysth)\ s * \/* \ s *(。*?)\ s ** \ /。 IT现在工作。谢谢。 – 2009-12-22 08:07:31

+0

对不起,我没有注意到你在Perl中的事实。 – 2009-12-22 18:55:17

2

您的正则表达式中的“private”和数据中的“privite”之间存在不匹配。

(\w+)之后应该没有^;相反,你将有

\s*=\s*\<\s*(\S+)\s+(\S+)\s*\>\s*\/\*\s*(.*?)\s*\*\/ 

或类似的东西,假设总是有<内两件事情>和那些东西能有什么,但空间。如果这些假设不正确,则需要提供有关数据外观的更多信息。

2

Ouch。首先,有一个x修改,将允许在表达非显著的空白,这样就可以使其更易于阅读:(注意结尾大括号后的x修改)

my $pattern = qr{ 
    ^\s* 
    constant\s* 
    #etc 
}x; 

接下来,如已经通过前面的例子证明,你可以选择一个分隔字符的模式,这样你就不必逃避斜线表达式:

my $pattern1 = qr/delimited by slashes/; 
my $pattern2 = qr{delimited by curly braces}; 

如果你只想组的表达没有捕捉到它$1,$2等,你可以用th Ë(?:…)结构:

if ('foo bar' =~ /(?:foo)\s*(bar)/) { 
    say $1; # bar 
} 

或者,像Perl 5.10的,可以使用指定的捕获:

if ('foo bar' =~ /(?<name>foo)\s*bar/) { 
    say $+{name}; # foo 
} 

这一切都应该让你的正则表达式更具有可读性。您的问题的主要观点现在必须由其他人回答:)

2

不必太复杂的正则表达式。你只需要简单的。

$string= "constant fixup privite ConfigAlarms = <U1 0>   /* comment here*/"; 
@s = split/=/,$string; 
$s[-1] =~ s/<|>//g; #get rid of the <and> 
print $s[-1]; 

上述会给你

$ perl perl.pl 
U1 0   /* comment here*/ 

可以继续从这里,无论是通过再次分裂,或者使用匹配

@ss = split /\s+/ , $s[-1]; 
print Dumper(@ss); 

第一2个元件值将是U1一个简单的组和0,剩下的你可以加入(或拼接),并将你的意见