【问题标题】:Splitting a String into Tokens and Storing the Delimiters in Perl将字符串拆分为标记并在 Perl 中存储分隔符
【发布时间】:2010-12-26 08:21:35
【问题描述】:

我有一个这样的字符串:

a  b   c       d

我这样处理我的字符串:

   chomp $line;
    my @tokens = split /\s+/, $line;
    my @new_tokens;
    foreach my $token (@tokens) {    
        push @new_tokens, some_complex_function( $token );
    }
    my $new_str = join ' ', @tokens;

我想用原始空格重新加入字符串。有什么方法可以存储拆分中的空格并在以后重新使用它?或者这将是一个巨大的痛苦?它主要是装饰性的,但我想保留输入字符串中的原始空格。

【问题讨论】:

    标签: regex perl string-matching


    【解决方案1】:

    只在单词边界上拆分:

    split /\b/, $line;
    

    对于您的示例,这将给出:

    ('a','  ','b','   ','c','       ','d')
    

    编辑: 正如 brian d foy 指出的那样,\b 使用了错误的字符类,按照我最初的想法,我想出了使用环视断言。不过,这看起来比 Ether 的答案复杂得多:

    split /(?:(?<=\S)(?=\s)|(?<=\s)(?=\S))/, $line;
    

    【讨论】:

    • 这可能会意外地分裂在不是空白边界的东西上。
    • 感谢您指出这一点!我写了原始答案,没有考虑\w\s。相应地编辑了我的答案。
    【解决方案2】:

    你为什么不干脆做:my $new_str = uc( $line );

    更新 - 原始 uc() 只是“更复杂函数”的简写。

    嗯,一般你也可以:

    $line =~ s/(\S+)/more_complex_function($1)/ge;
    

    【讨论】:

    • 因为我的真实案例比较复杂,这只是一个例子。
    【解决方案3】:

    如果您使用带有捕获括号的正则表达式进行拆分,则拆分模式将包含在结果列表中(请参阅perldoc -f split):

    my @list = split /(\s+)/, 'a  b   c       d';
    print Data::Dumper::Dumper(\@list);
    
    VAR1 = [
              'a',
              '  ',
              'b',
              '   ',
              'c',
              '       ',
              'd'
            ];
    

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2014-12-20
      • 2013-09-15
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      相关资源
      最近更新 更多