什么是正则表达式替换"$ content = ~s/\n-- \n.*?$ // s"实际上在做什么?

can*_*man 6 regex perl rt

我正在使用Request Tracker 4.0中的一些Perl代码,并且遇到了一个错误,即票据请求者的消息被切断.我是Perl的新手,我已经用正则表达式完成了一些工作,但即使阅读了很多,我也遇到了一些问题.

我已将问题缩小到这行代码:

$content =~ s/\n-- \n.*?$//s
Run Code Online (Sandbox Code Playgroud)

我不完全理解它在做什么,并希望得到更好的解释.

我知道这s/ /与模式匹配\n-- \n.*?$并且没有任何替代.

我不明白是什么.*?$.这是我的基本理解:

  • . 是除\n之外的任何字符
  • * 是前一个字符的0或更多倍
  • ? 是前一个字符的0或1倍
  • $ 是字符串的结尾

然后,根据我的理解,决赛s使.比赛成为新线

所以,粗略地说,我们正在替换以...开头的任何文本\n-- \n- 这行代码导致了一些可疑的行为,如果有人可以解释这里发生了什么,我会很乐意解决这个问题.

有人可以解释这条线在做什么吗?它只是删除了第一个之后的所有文本\n-- \n还是有更多文本 ?

冗长的部分/现实生活中的问题(你不需要阅读本文来回答这个问题)

我的确切问题是它正在删除签名处的引用内容.

因此,如果来自客户的电子邮件A说:

订单ABCD怎么回事?
- 一些客户

工作人员回复说(注意失去客户的签名)

它今天发货

订单ABCD怎么回事?

客户回复

我没有得到它,它没有发货!
- 一些客户

它今天发货

订单ABCD怎么回事?

当我们回复时,他们的信息会切断 - 这会杀死所有上下文.

它今天发货,追踪号码12345

我没有得到它,它没有发货!

并导致更多的工作解释它是什么顺序,等等.

Mor*_*kus 8

你几乎是正确的:它会删除从最后一次出现的"\n-- \n"到结尾的所有内容.这不会删除第一次出现的所有内容是由于非贪婪运算符?- 它告诉正则表达式引擎匹配前一个模式(.*)的最短可能形式.

这样做:在电子邮件通信中,签名通常通过这种模式与消息体分离:一行由两个破折号和一个尾随空格组成.因此,正则表达式所做的是删除从签名分隔符开始到结尾的所有内容.

现在,您的客户(手动或其电子邮件客户端)在签名分隔符后添加电子邮件的引用回复.这非常不寻常:引用的回复必须位于签名修饰符之前.我不知道有一个电子邮件客户端是故意这样做的,但是有很多程序只是从那里收到电子邮件(从引用的字符串问题到SMTP不符合,你可以犯下大量的错误)所以我不会惊讶地发现确实有这样的客户.

另一种可能性是这是对客户的影响 - 就像之后签署自己的名字一样--.但是,我怀疑这不是手动完成的,因为人们很少在两次破折后插入一个尾随空格后跟一个换行符.