我有一个由几个单词组成的字符串(以大写字母分隔)。
例如:
$string1="TestWater"; # to be splited in an array @string1=("Test","Water")
$string2="TodayIsNiceDay"; # as @string2=("Today","Is","Nice","Day")
$string3="EODIsAlwaysGood"; # as @string3=("EOD","Is","Always","Good")
我知道Perl容易拆分使用split函数作为固定字符,或者匹配正则表达式可以将$ 1,$ 2与固定数量的变量分开。但是如何动态完成呢?提前谢谢!
那篇文章Spliting CamelCase没有回答我的问题,我的问题与Perl中的正则表达式更相关,一个是Java语言(差异适用于此处)。
答案 0 :(得分:7)
使用split在正则表达式上拆分字符串。你想要的是一个大写字符,后面没有一个大写字符作为边界,可以用两个前瞻断言表示(perlre了解详情):
#!/usr/bin/perl
use warnings;
use strict;
use Test::More;
sub split_on_capital {
my ($string) = @_;
return [ split /(?=[[:upper:]](?![[:upper:]]))/, $string ]
}
is_deeply split_on_capital('TestWater'), [ 'Test', 'Water' ];
is_deeply split_on_capital('TodayIsNiceDay'), [ 'Today', 'Is', 'Nice', 'Day' ];
is_deeply split_on_capital('EODIsAlwaysGood'), [ 'EOD', 'Is', 'Always', 'Good' ];
done_testing();
答案 1 :(得分:2)
您可以在列表上下文中使用m//g
来执行此操作,该列表上下文会返回找到的所有匹配项的列表。 (经验法则:如果您知道要提取的内容,请使用m//g
;如果您知道要丢弃的内容,请使用split
。)
您的案例有点复杂,因为您想将"EODIs"
拆分为("EOD", "Is")
。
以下代码处理这种情况:
my @words = $string =~ /\p{Lu}(?:\p{Lu}+(?!\p{Ll})|\p{Ll}*)/g;
即。每个单词都以大写字母(\p{Lu}
)开头,后跟
\p{Ll}
)