倾斜牙签综合症
倾斜牙签综合症(leaning toothpick syndrome,LTS)是指在计算机程序设计中,由于表达式包含了大量的转义字符而使代码变得难以阅读,通常是指反斜线 ("\")开头的转义字符序列。
Perl语言的官方文档[1]引入了这一术语,用于描述Unix风格的正则表达式中大量的前向斜线。
LTS出现在许多程序设计语言与许多环境中, 包括用于匹配统一资源定位符(URI)的模式(Pattern (software)),以及输出被引用文本的程序中,许多自产生程式属于后一类。
目录 |
模式的例子 [编辑]
下述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);
qq运算符在Perl中允许任意分界符:
print qq{<a href="$url">$text</a>};
print qq|<a href="$url">$text</a>|;
print qq(<a href="$url">$text</a>);
Here文档(here document)特别适合于多行文档;但是,Here文档不能够正确的缩进。这样的Perl示例为:
print <<HERE_IT_ENDS;
<a href="$url">$text</a>
HERE_IT_ENDS
其它语言 [编辑]
C# [编辑]
C-sharp程序设计语言处理LTS是在字符串开始的引号之前加上'@'这个字符,例如:
string filePath = @"C:\Foo\Bar.txt"
而不是这样:
string filePath = "C:\\Foo\\Bar.txt"
C++ [编辑]
C++11增加了raw strings:
std::string filePath = R"(C:\Foo\Bar.txt)";
如果字符串包含了)"这两个字符的组合,可选别的分界符,如d,例如:
std::regex re{ R"d(s/"\([^"]*\)"/'\1'/g)d" };
Python [编辑]
Python有类似的结构,使用'r'标志:
filePath = r"C:\Foo\Bar.txt"
Scala [编辑]
Scala程序设计语言允许三个引号以避免转义混淆:
val filePath = """C:\Foo\Bar.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,