2017-04-02 96 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中做到這一點,並確保像8.之類的數字不會出現在spitting之後。

+0

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

+0

我不確定 - 您是否要分割_by_'8.'(etc)?換句話說,你最終是否希望有'9 ...運行'(等),或者,'8'。 9. ......(等)? – zdim

+0

你有什麼試過的?最近這些帖子的得分很低,沒有顯示出執行的努力。有些語言文檔向你展示瞭如何實現這種語言,這似乎更像是想讓某人爲你做你的工作。 – vol7ron

回答

2

如果目的是通過8.9.(等)

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

陣列分割@contents具有9 Run ...(最多9)等,用換行和所有。 split中的模式/.../是一個完整的正則表達式,它在字符串中匹配時被視爲要分割的分隔符。上面的正則表達式指定了一個數字後跟一個句點,所以字符串被任何這樣的字符串分隔。

由於在這種情況下也split捕獲(空字符串)之前的第一個匹配(8.),我們使用grep過濾掉空字符串,通過要求每個元素的至少一個字符匹配。

您可能還希望選擇更實質性的過濾,例如grep { /\S/ },這將要求每個元素至少有一個非空格,從而丟棄那些只有空格的過濾器。

或者,你可以只檢查的第一個元素

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

在圖示的例子有一定首先是一個空字符串。

什麼是最合適的方法通常取決於8.之前實際可能做什麼,您想要做什麼以及您想要對可能的元素只包含空格(如從14. 15.),或者甚至是空的字符串(從14.15.)。


如果目標是捕獲8.9.(等等),那麼正則表達式是更好的

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

數組@num_dot包含: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. 

後者提供:

9   Run 
     Keywords :- RUN; 

10  spreadshee 
     Keywords :- spreadsheet; 

11  Book 
     Keywords :- Book; 

15  Hide 
     Keywords :- Hide; 

132  Pick 
     Keywords :- Pick; 

如果不回答:

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減去號碼你的問題,但要說明你期望從你的例子中得到什麼輸出。