【问题标题】:Complex line parse - need help复杂的行解析 - 需要帮助
【发布时间】:2009-12-22 06:18:05
【问题描述】:

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

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)/)

【问题讨论】:

    标签: perl parsing


    【解决方案1】:

    听取您的意见:

    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 中。

    【讨论】:

    • \s+/*(.*?)*/ 不能用于评论部分。我改为(从下面的ysth) \s*\/*\s*(.*?)\s**\/ 。它现在工作了。谢谢。
    • 对不起,我没有注意到你在 Perl 中。
    【解决方案2】:

    您的正则表达式中的“私有”与数据中的“私有”不匹配。

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

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

    或类似的东西,假设 内总是有两个东西,并且这些东西可以有任何东西,但空格。如果这些假设不正确,您需要提供有关您的数据可能是什么样子的更多信息。

    【讨论】:

      【解决方案3】:

      哎哟。首先,有一个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
      }
      

      这一切都应该使您的正则表达式更具可读性。您问题的重点现在肯定已经被其他人回答了:)

      【讨论】:

        【解决方案4】:

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

        $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,其余的您可以加入(或拼接)并将成为您的 cmets

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-15
          • 2017-09-20
          • 2016-07-14
          • 1970-01-01
          相关资源
          最近更新 更多