【问题标题】:Perl, Split string by specific patternPerl,按特定模式拆分字符串
【发布时间】:2018-10-23 01:12:28
【问题描述】:

我发现了如何用空格分割字符串,但这只考虑了一个字符。就我而言,我已将 cmets 粘贴到包含换行符和空格的文件中。我用这个字符串分隔它们:[|]

所以我需要将我的 $string 拆分为一个数组,例如 $string =

This is a comment.
This is a newline.    
This is the end[|]This is second comment.
This is second newline.    
[|]Last comment

被拆分为 $array[0]、$array[1] 和 $array[2],其中包括换行符和空格。用 [|] 分隔

我在网上找到的每个示例都使用单个字符(例如空格或换行符)来拆分字符串。在我的情况下,我必须使用更具体的标识符,这就是为什么我选择了 [|] 但在拆分它时遇到了麻烦。

我试图将其限制为通过单个“|”进行解析带有此代码的字符:

my @words = split /|/, $string;
foreach my $thisline (@words) {
    print "This line = '" . $thisline . "'\n";

但这似乎将整个字符串逐个字符拆分为@words。

【问题讨论】:

    标签: perl parsing


    【解决方案1】:

    [|]都是正则表达式中的特殊字符——|用于分隔选项,[…]用于指定字符集。使用不带引号的| 使表达式匹配空字符串(更具体地说:空字符串或空字符串),使其在每个字符边界上匹配和拆分。这些字符必须转义才能在表达式中按字面意思使用:

    my @words = split /\[\|\]/, $string;
    

    由于所有的行都在视觉上造成混乱,您应该使用m{} 引号而不是//,并使用\Q…\E 来引用一系列字符,而不是每个字符都使用单独的反斜杠。 (这在功能上是相同的,只是更容易阅读。)

    my @words = split m{\Q[|]\E}, $string;
    

    【讨论】:

    • 谢谢!但是 m{} 是否只允许我按单个字符拆分,或者我可以使用它通过(例如)三个字符进行拆分: [|] ?
    • 像魔术一样工作。我显然需要参加正则表达式速成课程。到目前为止,我一直避免使用它,因为我的大脑很难阅读所有的符号。但现在我看到它在行动,我很难避免它!试图支持您的回答,但我作为新用户没有足够的声誉,所以我再说一遍:非常感谢您!对不起,如果这是一个重复的问题,我搜索了..
    • @duskwuff:如果你想指定一个运算符,那么qr/.../m/.../ 更合适,因为没有实际匹配发生。但我更喜欢裸露的/.../,它提醒人们这是一个没有任何外来噪音的正则表达式模式。
    • split 使用正则表达式。可以使用任何正则表达式。有关详细信息,请参阅perldoc perlreperldoc.perl.org/perlre.html
    猜你喜欢
    • 2015-12-18
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2018-11-10
    • 1970-01-01
    • 2022-07-12
    相关资源
    最近更新 更多