2017-07-14 128 views
0

我有一個由幾個單詞組成的字符串(用大寫字母分隔)。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容易分裂使用分功能固定字符,或正則表達式匹配可以分離$ 1,$ 2具有可變的固定的量。但是,這如何動態地完成呢?提前致謝!

那篇文章Spliting CamelCase沒有回答我的問題,我的問題更多地涉及Perl中的正則表達式,其中一個是在Java中(這裏有不同之處)。

+0

的可能的複製[正則表達式來分割駝峯或首字母大寫(高級)](https://stackoverflow.com/questions/7593969/regex-to-split-camelcase-or-titlecase-advanced) – Joe

+0

不重複,java正則表達式和perl正則表達式之間存在差異。但謝謝檢查! – dellair

回答

2

您可以通過使用m//g做到這一點列表上下文,它返回找到的所有匹配列表。 (經驗法則:使用m//g如果你知道你要提取什麼;使用split如果你知道你想扔掉的東西。)

你的情況有點複雜,因爲你要"EODIs"分成("EOD", "Is")

下面的代碼處理這種情況下:

my @words = $string =~ /\p{Lu}(?:\p{Lu}+(?!\p{Ll})|\p{Ll}*)/g; 

即每一個字以大寫字母(\p{Lu})開始,接着是任一

  • 1以上大寫字母(但最後一個是不跟一個小寫字母),或
  • 0以上小寫字母( \p{Ll}
+0

我真的很喜歡你的答案,非常整齊。非常感謝你! – dellair

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(); 
+0

爲什麼不會爲'TestWater'和'TodayIsNiceDay'產生空的主要元素? – melpomene

+2

@melpomene:記錄在[split](http://p3rl.org/split):EXPR開頭處的零寬度匹配永遠不會產生空字段 – choroba