2017-04-02 11 views
0

数字をつづってコンテンツを分割したい。正規表現でperlで分割する方法

my $info = "8. 9   Run 
     Keywords :- RUN; 

    9. 10  spreadsheet 
     Keywords :- spreadsheet; 

    10. 11  Book 
     Keywords :- Book; 

    11. 15  Hide 
     Keywords :- Hide; 

    12. 132  Pick 
     Keywords :- Pick; 

これは、8.9,10,11,12などの数字に基づいてコンテンツを分割した文字列です。 Perlでこれを行う方法と、spitingの後に8のような数字が現れないようにする方法はありますか?

+0

'my @captures = $ info =〜m/^ \ s *(\ d + \。)/ mg;' – DavidO

+0

私はよくわかりません - あなたは '8.'(など)を分割したいですか?言い換えれば、最後に '9 ... Run'(等)をしたいのですか? 9. ...(等)? – zdim

+0

何を試しましたか?これらの投稿は最近、スコアが低く、実行時の努力が実証されていません。言語を実装する方法を示す言語文書があります。これは、あなたのためにあなたの仕事をやる人を手に入れようとするようなものです。 – vol7ron

答えて

2

目的は8.によって9.(など)を分割する場合

my @contents = grep { /./ } split /\d+\./, $info; 

配列@contentsは改行とすべてと、9 Run ...(9まで)、などがあります。 はsplitで、完全正規表現です。文字列内で一致したときに分割する区切り文字とみなされます。上の正規表現は数字の後ろにピリオドを指定するので、文字列はそのようなもので分割されます。

この場合splitのでもキャプチャ(空文字列)前に最初の一致(8.)、我々は各要素が少なくとも一つの文字と一致することを要求することによって、空の文字列を除外するgrepを使用します。

また、grep { /\S/ }のように、各要素に少なくとも1つの非空白が必要なため、空白のみを含むものを破棄する必要があります。

それとも、あなたが最初に空の文字列になりますが、確実に示す例では最初の要素だけ

my @contents = split /\d+\./, $info; 
shift @contents if $contents[0] eq ''; 

を確認することができます。

8.の前に実際に何ができるか、あなたが何をしたいのか、空白のみを含む可能な要素(例えば14. 15.など)で何をしたいのか、文字列(14.15.から)。


目的はキャプチャ8.9.(など)をした場合、正規表現は、アレイ@num_dotが含まれてい

my @num_dot = $info =~ /(\d+\.)/g; 

優れている:8. 9. 10. 11. 12.

2

をそれはあなたが望むものは非常に明確ではないですが、数字を分割することは、何かを達成するための貧弱なアプローチのように思えます。

少なくとも、レコードごとの変更やレコードごとの情報の抽出を行いたいので、データをレコードに分割するほうがずっと良いでしょう。各レコードは、空白行で区切られているので、我々が使用することができます

my @items = split /\n\n/, $info; 

これが与える:

my @items = (
    "8. 9   Run\n  Keywords :- RUN;", 
    " 9. 10  spreadshee\n  Keywords :- spreadsheet;", 
    " 10. 11  Book\n  Keywords :- Book;", 
    " 11. 15  Hide\n  Keywords :- Hide;", 
    " 12. 132  Pick\n  Keywords :- Pick;", 
); 

を今、あなたが数字を削除したいようです。

s/^\s*\K\d+\.\s*// for @items; # Preserves the leading whitespace. 

s/^\s*\d+\.\s*// for @items;  # Removes the leading whitespace. 

後者は与える:

my @items = (
    "9   Run\n  Keywords :- RUN;", 
    "10  spreadshee\n  Keywords :- spreadsheet;", 
    "11  Book\n  Keywords :- Book;", 
    "15  Hide\n  Keywords :- Hide;", 
    "132  Pick\n  Keywords :- Pick;", 
); 

あなたはこれが与える

$info = join("\n\n", @items); 

を使用して$infoマイナスの数字を再構築することができます:

9   Run 
     Keywords :- RUN; 

10  spreadshee 
     Keywords :- spreadsheet; 

11  Book 
     Keywords :- Book; 

15  Hide 
     Keywords :- Hide; 

132  Pick 
     Keywords :- Pick; 

をこれが応答しない場合きみのあなたの例からどのような出力が期待されるのかを明確にしてください。

関連する問題