Perl正则表达式逐字拆分

时间:2017-07-14 12:13:33

标签: regex perl

我有一个由几个单词组成的字符串(以大写字母分隔)。

例如:

$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语言(差异适用于此处)。

2 个答案:

答案 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})开头,后跟

  • 一个或多个大写字母(但最后一个字母后面没有小写字母)或
  • 0个或更多小写字母(\p{Ll}