我正在使用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
我没有得到它,它没有发货!
并导致更多的工作解释它是什么顺序,等等.
你几乎是正确的:它会删除从最后一次出现的"\n-- \n"到结尾的所有内容.这不会删除第一次出现的所有内容是由于非贪婪运算符?
- 它告诉正则表达式引擎匹配前一个模式(.*
)的最短可能形式.
这样做:在电子邮件通信中,签名通常通过这种模式与消息体分离:一行由两个破折号和一个尾随空格组成.因此,正则表达式所做的是删除从签名分隔符开始到结尾的所有内容.
现在,您的客户(手动或其电子邮件客户端)在签名分隔符后添加电子邮件的引用回复.这非常不寻常:引用的回复必须位于签名修饰符之前.我不知道有一个电子邮件客户端是故意这样做的,但是有很多程序只是从那里收到电子邮件(从引用的字符串问题到SMTP不符合,你可以犯下大量的错误)所以我不会惊讶地发现确实有这样的客户.
另一种可能性是这是对客户的影响 - 就像之后签署自己的名字一样--
.但是,我怀疑这不是手动完成的,因为人们很少在两次破折后插入一个尾随空格后跟一个换行符.