复杂的行解析 - 需要帮助

时间:2009-12-22 06:18:06

标签: perl parsing

你能帮我纠正我的解析代码吗?

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

下面的代码, 我不知道如何获得 U1 0 **/* 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)/)

4 个答案:

答案 0 :(得分: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美元。

答案 1 :(得分:2)

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

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

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

或类似的东西,假设&lt;&gt;内有两件事。那些东西除了空间之外什么都有。如果这些假设不正确,您需要提供有关数据外观的更多信息。

答案 2 :(得分:2)

哎哟。首先,有一个x修饰符将允许表达式中的非重要空格,以便您可以使其更具可读性:

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

(注意结束大括号后的x修饰符。)接下来,正如上一个示例所示,您可以为模式选择一个分隔符,这样就不必转义斜杠了。表达式:

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

如果您只是将表达式分组而不将其捕获到$1$2等,则可以使用(?:…)构造:

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

或者,从Perl 5.10开始,您可以使用命名捕获:

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

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

答案 3 :(得分: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,其余的你可以加入(或拼接)并将是你的评论