代码之家  ›  专栏  ›  技术社区  ›  Richard Simões

是否存在包含转义序列的字符串的纯正则表达式拆分?

  •  2
  • Richard Simões  · 技术社区  · 14 年前

    给定一个管道分隔值字符串(称为 $psv ),我希望能够按这些管道拆分并填充数组。但是,字符串也可以包含转义管道( \| )逃走了( \\ )两者都被认为只是文字。我有几个解决这个问题的办法:

    • 将这两个转义序列替换为在 , split(/\|/, $psv)
    • $psv公司 ,逐字符

    我想这两个都可以。但为了最大限度地释放多巴胺,我只想用一个 split()

    4 回复  |  直到 14 年前
        1
  •  1
  •   David Z    14 年前

    如果Perl支持可变宽度的look-behind断言,那么您可以使用以下方法:

    split(/(?<!(?<!\\)(?:\\\\)*\\)\|/, $psv);
    

    $psv 一次一个角色)可能是更好的选择。

    我想您还可以尝试将管道字符上的字符串拆分,然后检查结果列表中的每个元素是否以奇数个反斜杠结束。如果有,则使用 |

        2
  •  4
  •   Roland Illig    14 年前

    你不需要使用 split 对于此任务。另一种选择是:

    my $psv = "aaa|bbb||ccc|\\|\\|\\||\\\\\\\\\\\\";
    print "$psv\n";
    
    my @words = map { s/\\([\\|])/$1/g; $_; } ($psv =~ /(?:^|\|) ((?:\\[\\|] | [^|])*)/gx);
    printf("%s\n", join(", ", @words));
    

    \ +其中之一 \| )或者除了管道以外的任意字符。

    map 只是用它们真正的意思来替换转义序列。

        3
  •  4
  •   DVK    14 年前

    你有什么特别的理由要求 纯正则表达式 解决方案(当然,除非这个问题更多的是精神上的挑战,而不是实际问题)。

    Text::CSV_XS (别让名字骗了你——它可以处理任何分隔符,而不仅仅是逗号)。它将正确处理转义和引用。

        4
  •  1
  •   Community leo1    4 年前


    #!/usr/bin/perl -w
    
    use strict;
    
       sub main{
          (my $psv = <DATA>) =~ s/\s+$//s;
          
          my @arr = $psv =~ /(?:^|\G\|)((?:[^\\|]|\\.)*)/sg;
          
          {
             local $" = ', ';      # $" - sets the pretty print
             print "@arr \n";      # outputs: abc, def, g\|i, jkl, m\|o, pqr, s\\u, v\w, x\\, , z 
          }
          
       }
       
       main();
    
    
    __DATA__
    abc|def|g\|i|jkl|m\|o|pqr|s\\u|v\w|x\\||z