将字符串拆分为标记并在 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 中存储分隔符的主要内容,如果未能解决你的问题,请参考以下文章