Perl和元字符中的斜杠和散列

Mik*_*ley 1 regex perl slash

感谢大家以前的帮助!我有一个关于Perl中RegExp的查询

我的问题是......

我知道,匹配时你可以写m //或//或##(如果你使用它,必须包括m或s).是什么让我感到困惑是一本关于逃避角色的书籍例子.我相信大多数人逃脱了很多角色,作为一个确定的程序工作方式而不会错过一个元字符,即:\ @当想在电子邮件地址中匹配@ say时.

这是我的问题,我知道这个脚本的作用:

$date= "15/12/99"
$date=~ s#(\d+)/(\d+)/(\d+)#$1/$2/$3#; << why are no forward slashes escaped??
print($date);
Run Code Online (Sandbox Code Playgroud)

然而我后面的例子,显示它被重写,因为(我也理解并且它们被逃脱)

$date =~ s/()(\d+)\/(\d+)\/(d+)/$2\/$1\/$3; <<<<which is escaping the forward slashes.
Run Code Online (Sandbox Code Playgroud)

我知道斜杠或哈希是程序员的偏好和它们的用途.我不明白的是为什么第二个例子,逃避斜线,但第一个没有 - 我已经尝试过,他们双向工作.哈希没有逃脱的斜线?甚至更令人困惑的是,看着我之前还有另一本书的例子,再次使用哈希,它们也逃脱了@符号.

if ($address =~ m#\@#) { print("That's an email address"); } 或类似的东西

那你从什么不使用哈希或斜线逃脱了什么?我知道你必须逃脱元字符以匹配它们但我很困惑.

Gab*_*ger 8

构建正则表达式时,将角色定义为正则表达式的分隔符,即执行//##.
如果你需要在正则表达式中使用该字符,则需要将其转义,以便regexp引擎不会将其视为正则表达式的结尾.

如果在正斜杠之间构建正则表达式/,则需要转义正则表达式中包含的正斜杠,因此在第二个示例中转义.

当然,相同的规则适用于您用作正则表达式分隔符的任何字符,而不仅仅是正斜杠.

  • 值得一提的是,Perl这样做的原因是为了避免"倾斜牙签综合症" - http://en.wikipedia.org/wiki/Leaning_toothpick_syndrome (2认同)