代码之家  ›  专栏  ›  技术社区  ›  Patrick

正则表达式教程,我如何改进它

  •  1
  • Patrick  · 技术社区  · 17 年前

    <address> <11 * ascii character value>      <11 characters>
    00C4F244  75 6C 74 73 3E 3C 43 75 72 72 65  ults><Curre
    

    我想去掉除末尾的11个字符之外的所有内容,并使用以下表达式:

    "^[0-9A-F+]{8}[\\s]{2}[0-9A-F\\s]{34}"
    

    这与我不想要的位相匹配,然后我从原始字符串中删除了这些位。我想看看你会怎么做,但我无法处理的特定区域是:

    再看一遍,最简单的方法是匹配每个输入行的最后11个字符,但这不是很灵活,为了学习正则表达式,我想看看如何从序列开始进行匹配。

    编辑:谢谢大家,这就是我想要的:

    "(?:^[0-9A-F]{8}  )(?:[0-9A-F]{2} ){11} (.*)"
    

    希望我能让你们中不止一个人变绿。

    6 回复  |  直到 17 年前
        1
  •  5
  •   Gumbo    17 年前

    ^.{44}(.{11})
    
        2
  •  2
  •   kmkaplan    17 年前

    ...........$
    

    .{11}$
    

    匹配十六进制字节+空格,重复十一次:

    ([0-9A-Fa-f]{2} ){11}
    
        3
  •  1
  •   chaos    17 年前

    Parens用于分组和提取。如何检索它取决于您的语言上下文,但现在在初始模式之后,所有内容都设置了某种$1。

        4
  •  0
  •   user68610    17 年前

    ^[0-9A-F\s]{42}

        5
  •  0
  •   Sylverdrag    17 年前

    匹配线的末端将是

    .{11}$
    

    为了只匹配结尾,你可以用积极的眼光看待后面。

    "(?<=(^[0-9A-F+]{8}[\\s]{2}[0-9A-F\\s]{34}))(.*?)$"
    

    这将匹配任何字符,直到行尾,前提是它前面有“向后看”表达式。

    (?<=….)定义了在匹配之前必须满足的条件。

    Regex designer .

        6
  •  0
  •   Brad Gilbert    17 年前

    如果你正在使用 Perl unpack() ,获取每个元素。

    my @data;
    
    open my $fh, '<', $filename or die;
    for my $line(<$fh>){
      my($address,@list) = unpack 'a8xx(a2x)11xa11', $line;
      my $str = pop @list;
    
      # unpack the hexadecimal bytes
      my $data = join '', map { pack 'H2',$_ } @list;
    
      die unless $data eq $str;
    
      push @data, [$address,$data,$str];
    }
    close $fh;
    

    我还继续将11个十六进制代码转换回字符串,使用 pack() .