【问题标题】:Perl: how to remove all after first blank line?Perl:如何在第一个空行之后删除所有内容?
【发布时间】:2014-10-05 04:55:16
【问题描述】:

我有一些字符串,我需要删除这个字符串中第一个空行之后的所有内容。

我试过用这个 $string = ~s/\^\s*$.*// 但是这个表达式会删除字符串中的所有字符!

【问题讨论】:

  • = ~ 不是绑定运算符=~,它是= 赋值运算符和~ 按位求反。

标签: regex perl


【解决方案1】:

使用以下内容:

  • \h 匹配水平间距,
  • \n 匹配换行符
  • /m 修饰符允许^ 匹配任何行
  • /s 修饰符,因此任何字符都将匹配换行符

如图所示:

use strict;
use warnings;

my $string = do {local $/; <DATA>};

$string =~ s/^\h*\n.*//ms;

print $string;

__DATA__
Hello World
Second Line

New Paragraph
another line
final line

输出:

Hello World
Second Line

附录

要将标题与正文分开,只需使用split

从技术上讲,模式应该只是 /\n\n/,但鉴于您的问题的上下文,我建议:

my ($header, $body) = split /\n\h*\n/, $string, 2;

【讨论】:

  • 它在新文件中有效,但在我的代码中无效。我的最后一个问题link 答案不适合我,因为处理程序需要消息的原始标头。 $header = $imap->message_string($msg);正文和标题分隔空行。
  • 然后就像我的附录一样使用split
  • 谢谢,这个工作与拆分,但我不明白为什么不工作建设$string =~ s/^\h*\n.*//ms; 和我的$string =~ s/\^\s*$.*//
  • 好吧,你的正则表达式正在尝试使用文字 carot \^ 而不是正则表达式符号作为行首 ^。此外,您没有使用 /m 修饰符来更改 ^$ 的含义以匹配任何行。此外, \s* 将匹配换行符。如果没有 /s 修饰符,任何字符都不会匹配换行符。您的方法存在一些问题。
猜你喜欢
  • 2019-10-21
  • 2018-03-11
  • 2012-05-19
  • 1970-01-01
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多