代码之家  ›  专栏  ›  技术社区  ›  Thomas Owens

如何创建Perl正则表达式以删除第一个“<”之前的所有字符?

  •  1
  • Thomas Owens  · 技术社区  · 15 年前

    我现在有这个: tr/[.]+(?=<)//d 它应该删除所有字符(由 [.]+ )直到第一个 "<" 因为我在用积极的眼光看问题。但出于某种原因,它将所有 "." “<” 从字符串开始。

    对于记录,我没有用正则表达式处理HTML或XML。

    5 回复  |  直到 15 年前
        1
  •  6
  •   brian d foy JRFerguson    15 年前

    当在[]中用作字符类时,字符的含义会发生变化。[.]没有意义,真的,不同于仅仅。所以。字面意思就是在这种情况下。

    我认为这应该很有效:

    $text =~ s/^.*?</</s; 
    
        2
  •  6
  •   Sinan Ünür    15 年前

    你不想要 tr .

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    while ( <DATA> ) {
        last unless /\S/;
        s/^.+?</</;
        print;
    }
    
    __DATA__
    a < b < c
    a < b < c
    
        3
  •  3
  •   SilentGhost    15 年前
    ^[^<]+
    

    . (dot)在character类中是文本点,而不是通配符。

        4
  •  3
  •   mirod    15 年前

    字符类中的“.”不是元字符。你也想要 s/// 不是 tr ,替换单个字符。所以 s/^.+(?=<)// 应该工作,尽管我会亲自写 s{^.*<}{<} 为了避免前视的事情。

        5
  •  1
  •   Sinan Ünür    15 年前

    澄清后编辑:

    if ($line =~ /^.+?<(.+)/) {
      push @matched, $1;
    }