倾斜牙签综合征




倾斜牙签综合征leaning toothpick syndrome,LTS)是指在计算机程序设计中,由于表达式包含了大量的转义字符而使代码变得难以阅读,通常是指反斜线("")开头的转义字符序列。


Perl语言的官方文档[1]引入了这一术语,用于描述Unix风格的正则表达式中大量的前向斜线。


LTS出现在许多程序设计语言与许多环境中,包括用于匹配统一资源定位符(URI)的模式(Pattern (software)),以及输出被引用文本的程序中,许多自产生程式属于后一类。




目录






  • 1 模式的例子


  • 2 被引用文本的例子


  • 3 其它语言


    • 3.1 C#


    • 3.2 C++


    • 3.3 Python


    • 3.4 Scala


    • 3.5 Sed




  • 4 参见


  • 5 参考文献





模式的例子


下述Perl正则表达式用来匹配在某个FTP服务器的pub目录下的文档的URI:


  m/ftp://[^/]*/pub//

Perl通过允许正则表达式使用其它分界符来解决倾斜牙签综合症。例如,下述三个正则表达式均等价于上例:


 m{ftp://[^/]*/pub/}
m#ftp://[^/]*/pub/#
m!ftp://[^/]*/pub/!


被引用文本的例子


以下Perl样例程序用于输出HTML链接的文本,其中URL与显示文本分别存于变量$url$text之中,代码如下:


 print "<a href="$url">$text</a>";

注意上述程序中使用反斜线转义双引号。如果使用单引号括起上述字符串表达式,在Perl中是不可行的,因为Perl对单引号字符串不执行变量展开:


 print '<a href="$url">$text</a>'

在许多语言中使用printf函数是可行的办法(Perl,C,PHP):


 printf("<a href="%s">%s</a>", $url, $text);

在Perl中使用qq即可用任意字符代替双引号:


 print qq{<a href="$url">$text</a>};
print qq|<a href="$url">$text</a>|;
print qq(<a href="$url">$text</a>);

Here文档特别适合于多行文档;但是,Here文档不能够正确的缩进。这样的Perl示例为:


 print <<HERE_IT_ENDS;
<a href="$url">$text</a>
HERE_IT_ENDS


其它语言



C#


C#语言处理LTS的方法是在字符串开始的引号之前加上“@”这个字符,例如:


string filePath = @"C:FooBar.txt"

而不是这样:


string filePath = "C:\Foo\Bar.txt"


C++


C++11增加了原始字符串:


 std::string filePath = R"(C:FooBar.txt)";

如果字符串包含了)"这两个字符的组合,可选别的分界符,如d,例如:


 std::regex re{ R"d(s/"([^"]*)"/'1'/g)d" };


Python


Python也有原始字符串的机制,在字符串前加上“r”即可:


 filePath = r"C:FooBar.txt"


Scala


Scala语言可用三个引号以避免转义混淆:


 val filePath = """C:FooBar.txt"""
val pubPattern = """ftp://[^/]*/pub/"""r

三引号也可用于多行字符串,例如:


 val text = """First line,
second line."""


Sed


Sed正则表达式,尤其当使用“s”操作符时,具有和Perl类似的问题——缺省分界符是“/”,但是其它分界符也可以使用——缺省是s/regexp/replacement/,但是s,regexp,replacement,效果是一样的。例如,为了匹配上述Perl例子之中的"pub"目录并替换为"foo",使用斜线的缺省形式是:


s/ftp://[^/]*/pub//foo/

使用(',')分界符的形式为:


s,ftp://[^/]*/pub/,foo,


参见



  • 字符串

  • 正则表达式



参考文献





  1. ^ perlop - perldoc.perl.org









Popular posts from this blog

Guess what letter conforming each word

Port of Spain

Run scheduled task as local user group (not BUILTIN)