代码之家  ›  专栏  ›  技术社区  ›  James Finnegan

简单解析不打印字符串中的日期

  •  0
  • James Finnegan  · 技术社区  · 3 年前

    我不知道为什么我的解析不能处理这个字符串。我把 ? .* ,但我不明白为什么第一个解析不起作用。这是字符串和第一次和第二次解析。

    my $string = "/usr/local/bin/python3.9 -u /usr/local/bin/scripts/master_program.py 4002 daily true 20230421";
    my $pythonpgm = "master_program.py";
    my ($midmark1) = $string =~ /.*$pythonpgm \d+ .*(\d+).*/;
    my ($midmark2) = $string =~ /.*$pythonpgm \d+ .*?(\d+).*/;
    
    print "\nmidmark1 =>  $midmark1\n";
    print "\nmidmark2 =>  $midmark2\n\n";
    

    这是打印输出:

    midmark1 =>  1
    
    midmark2 =>  20230421
    
    2 回复  |  直到 3 年前
        1
  •  2
  •   ikegami Gilles Quénot    3 年前

    这个 .* 匹配它所能匹配的一切。它会一直匹配到字符串的末尾,但随后 \d+ 不匹配。

    ...master_program.py 4002 daily true 20230421
    \_/\_______________/|\__/|\_________________/         XXX Wrong
     |          |       | |  |        |          X
     |          |       |  \  \       |          |
    .*      $pythonpgm [ ] \d+ [ ]    .*       (\d+) .*
    

    所以它放弃了一个字符来允许 \天+ 以匹配。

    ...master_program.py 4002 daily true 20230421
    \_/\_______________/|\__/|\________________/||
     |          |       | |  |        |         | \
     |          |       |  \  \       |         |  \
    .*      $pythonpgm [ ] \d+ [ ]    .*      (\d+) .*
    

    我会用

    / \Q$pythonpgm\E [ ] \d+ [ ] .* [ ] (\d+) \z /x
    

    日期前的空格充当锚点,强制 * 进一步回溯。

        2
  •  -2
  •   Gilles Quénot ticktalk    3 年前

    与其尝试复杂的事情,我建议采用一种更简单的方法:

    #!/usr/bin/perl
    
    my $string = "/usr/local/bin/python3.9 -u /usr/local/bin/scripts/master_program.py 4002 daily true 20230421";
    my $pythonpgm = "master_program.py";
    my ($midmark1) = $string =~ /.*$pythonpgm \d+ .*(\d+).*/;
    my ($date)     = $string =~ /.*$pythonpgm.*?(\d+)$/;
    
    print "\nmidmark1 =>  $midmark1\n";
    print "\ndate     =>  $date\n\n";
    
    midmark1 =>  1
    date     =>  20230421
    

    日期部分是行的最新数字,因此锚点 $ 有道理。让我们 KISS