如何在perl中使用正则表达式拆分

时间:2017-04-02 03:35:45

标签: regex 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.这样的数字。

2 个答案:

答案 0 :(得分:2)

如果目标是通过 8.拆分9.(等)

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

数组@contents9 Run ...(最多9个)等,带有换行符和所有内容。 split中的模式/.../是一个完整的正则表达式,当在字符串中匹配时,它被视为要拆分的分隔符。上面的正则表达式指定一个数字后跟一个句点,因此字符串被任何此类字符串拆分。

由于split在这种情况下也会在第一次匹配(8.)之前捕获(空字符串),我们使用grep来过滤掉空字符串,要求每个元素至少匹配一个字符。

您可能还希望选择更实质的过滤,例如使用grep { /\S/ },这要求每个元素至少有一个非空格,从而丢弃那些只有空格的过滤。

或者,您只能检查第一个元素

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

在显示的例子中,肯定会有一个空字符串。

最合适的方法通常取决于8.之前的实际情况,您想要做什么,以及您想要对仅包含空格的可能元素做什么(例如来自{{1} }},甚至是空字符串(来自14. 15.)。

如果目标是捕获 14.15.8.(等),那么正则表达式会更好

9.

数组my @num_dot = $info =~ /(\d+\.)/g; 包含:@num_dot

答案 1 :(得分: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减去数字
$info = join("\n\n", @items);

这给出了:

9         Run
       Keywords :- RUN;

10        spreadshee
       Keywords :- spreadsheet;

11        Book
       Keywords :- Book;

15        Hide
       Keywords :- Hide;

132        Pick
       Keywords :- Pick;

如果这不能回答您的问题,请说明您对示例的期望输出。