2017-07-14 13 views
0

私はいくつかの単語(大文字で区切られた)からなる文字列を持っています。単語ごとに文字列を分割するPerlの正規表現

例えば

:私はPerlは簡単に分割が固定された文字のsplit関数を使用して、またはマッチ正規表現は、変数の一定の量で$ 1、$ 2を分離できることを知っている

$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") 

。しかし、どのようにこれを動的に行うことができますか?前もって感謝します!

ポストSpliting CamelCase私の質問に答えていない、私の質問は、Perlの正規表現に関連しています、その1つはJava(違いがここに適用される)です。

+0

[キャメルケースまたはタイトルケース(高度)を分割する正規表現]の可能な重複(https://stackoverflow.com/questions/7593969/regex-to-split-camelcase-or-titlecase-advanced) – Joe

+0

ありません重複すると、Java正規表現とperl正規表現の間に違いがあります。しかし、確認のおかげで! – dellair

答えて

2

あなたがでm//gを使用することによってこれを行うことができますlistコンテキストは、見つかったすべての一致のリストを返します。 (親指のルール:使用m//gはあなたが抽出したいのかを知っていれば、あなたが捨てたいものを知っていればsplitを使用しています。)あなたは("EOD", "Is")"EODIs"を分割したいので

あなたの場合はもう少し複雑です。

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

即ち:

次のコードは、このケースを扱いますすべての単語は大文字(\p{Lu})で始まり、どちらか

  • 1以上の大文字(しかし、最後の一つは小文字が続いていない)、または
  • 0以上の小文字(が続いています\p{Ll}
+0

私は本当にあなたの答えがとても好きです。どうもありがとうございました! – dellair

7

splitを使用すると、文字列を正規表現に分割できます。何が欲しいのは2先読みアサーション(詳細は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

関連する問題