【问题标题】:Extract text between commas and quotes, ignoring escaped characters in perl提取逗号和引号之间的文本,忽略 perl 中的转义字符
【发布时间】:2016-04-07 21:43:21
【问题描述】:

我需要分隔以下字符串:"ABC", err, "%. Exiting." , "Use options \"-a,-a,-s,-t\" OR \"-aa,-bb\".",0,-1,"" 进入逗号和引号之间的字符。我在 perl 中使用以下正则表达式:\(".*?"|[^",]+)(?=\s*,|\s*$)\g。这给了我以下输出,其中标识了一个额外的空间。

"ABC"
err
"%. Exiting."
  #[Unwanted Match]
"Use options \"-a,-a,-s,-t\" OR \"-aa,-bb\"."
0
-1
"" #[This Match is required]

我怎样才能忽略这个空格,在最后保留引号中的空字符串

【问题讨论】:

    标签: regex string perl split


    【解决方案1】:

    不要使用正则表达式。虽然他们可以做到,但您正在匹配嵌套的东西,这充其量会使正则表达式变得非常混乱和复杂。使用解析器。赞Text::ParseWords

    #!/usr/bin/env perl
    use strict;
    use warnings;
    
    use Text::ParseWords;
    
    my $line = '"ABC", err, "%. Exiting." , "Use options \"-a,-a,-s,-t\" OR \"-aa,-bb\".",0,-1,""';
    my @words = parse_line( ',', 1, $line );
    print join ("\n", @words );
    

    这给出了:

    "ABC"
     err
     "%. Exiting." 
     "Use options \"-a,-a,-s,-t\" OR \"-aa,-bb\"."
    0
    -1
    ""
    

    【讨论】:

      【解决方案2】:

      我同意@Sobrique 的解决方案。如果您仍想使用正则表达式,则需要选择您想要额外空白的位置。用它来修剪你的所有线条:

      /\s*(".*?"|[^",]+)\s*(?=\s*,|\s*$)/g
      

      如果您想在引号之前和之后允许空格,您可以使用如下正则表达式:

      /(\s*".*?"\s*|[^",]+)(?=\s*,|\s*$)/g
      

      两者都会删除不需要的命中,但会产生不同的结果。

      【讨论】:

      • 我认为这也可以证明我的观点。虽然您可以使用正则表达式来做到这一点(这说明了如何),但结果......有点难以理解,你最终会想知道你在 6 个月的时间里在想什么:)。
      猜你喜欢
      • 2012-09-05
      • 2012-10-31
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      相关资源
      最近更新 更多