2009-12-22 103 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,剩下的你可以加入(或拼接),並將你的意見