【问题标题】:String to split a complicated string in Perl [duplicate]在Perl中拆分复杂字符串的字符串[重复]
【发布时间】:2015-11-20 10:37:56
【问题描述】:

我有一个看起来像这样的字符串:

'som,ething', another, 'thin#'g', 'her,e', gggh*

我正在尝试将其拆分为不在元素中的逗号,如下所示:

'som,ething'
another
'thin#'g'
'her,e'
gggh*

我正在使用parse_line(q{,}, 1, $string),但是当字符串中包含单引号时它似乎失败了。我有什么遗漏吗?

【问题讨论】:

  • @vks 这不是重复的。首先,问题是针对 Perl,其次是问题指出字符串中的单引号是问题 - 而不是逗号。
  • 您实际上是否有不匹配的引号 - 'thin'g', - 这使得问题变得相当困难(您如何判断以下逗号属于哪个字段?)
  • @werhgvfwe5r,您真正需要的是来自链接问题的正则表达式。围绕它的 Perl 包装器绝对是微不足道的。
  • @Sobrique,是的,遗憾的是引号不匹配。但是,我在最初的问题中犯了一个小错误。引号中的引号通常使用特殊字符 (#) 进行转义。更新问题

标签: regex string perl


【解决方案1】:
#!/usr/bin/perl
use strict;
use warnings;
my $string = q{'som,ething', another, 'thin'g', 'her,e', gggh*};
my @splitted = split(/,(?=\s+)/, $string);
print $_."\n" foreach @splitted;

输出:

'som,ething'
 another
 'thin'g'
 'her,e'
 gggh*

Demo

【讨论】:

  • 嗯,虽然它与这个特定的字符串一起“工作”,但它显然与所描述的任务不匹配:q{'som , ething', another, 'thin'g', 'her,e', gggh*} = fail。
  • 忘了提到内部引号被散列(#)转义。我认为这可能会让事情变得更容易。
  • 此解决方案还假设逗号后跟一个空格。可能没有:a word,'another',field, here
【解决方案2】:

您似乎正在尝试解析逗号分隔值。答案是使用Text::CSV_XS,因为它可以处理您可能在数据中找到的各种奇怪情况。见How can I parse quoted CSV in Perl with a regex?

【讨论】:

    【解决方案3】:

    使用split 不是要走的路。如果您确定您的字符串格式正确,则使用全局匹配更简单,例如:

    my $line = "'som,ething', another , 'thin#'g', 'her,e' , gggh*";
    
    my @list = $line =~ /\s*('[^#']*(?:#.[^#']*)*+'|[^,]+(?<=\S))\s*/g;
    
    print join("|", @list);
    

    (?&lt;=\S) 仅用于修剪右侧的项目)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      相关资源
      最近更新 更多