将字符串拆分为标记并在 Perl 中存储分隔符

Posted

技术标签:

【中文标题】将字符串拆分为标记并在 Perl 中存储分隔符【英文标题】:Splitting a String into Tokens and Storing the Delimiters in 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;

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

【问题讨论】:

【参考方案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'
        ];

【讨论】:

以上是关于将字符串拆分为标记并在 Perl 中存储分隔符的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符串拆分为分隔符也是标记的数组? [复制]

将字符串拆分为标记并将标记分成两个单独的数组

如何在存储过程中拆分逗号分隔的字符串?

拆分用逗号分隔的字符串并将值存储到 int 数组中

拆分分隔符分隔的字符串并插入到oracle 11中的表中

我想拆分用逗号分隔的字符串并在 SQL Server 中另存为新行 [重复]