我想在java中使用多行字符串,所以我寻求一个简单的预处理器来将C风格的多行转换为带有文字'\n'的单行.
之前:
System.out.println("convert trailing backslashes\
this is on another line\
\
\
above are two blank lines\
But don't convert non-trailing backslashes, like: \"\t\" and \'\\\'");
Run Code Online (Sandbox Code Playgroud)
后:
System.out.println("convert trailing backslashes\nthis is on another line\n\n\nabove are two blank lines\nBut don't convert non-trailing backslashes, like: \"\t\" and \'\\\'");
Run Code Online (Sandbox Code Playgroud)
我认为sed会做得很好,但是sed是基于行的,所以替换'\'和它后面的换行符(有效加入两行)在sed中并不是很自然.我将sredden79的oneliner改编为以下 - 它有效,它很聪明,但不清楚:
sed ':a { $!N; s/\\\n/\\n/; ta }'
Run Code Online (Sandbox Code Playgroud)
替补是escaped literal backslash,newline有escaped literal backslash,n. :a是标签,ta如果替代品找到匹配,则为goto标签; $表示最后一行,并且$!是相反的(即所有行,但最后一行). N意味着将下一行附加到模式空间(从而使\n角色可见.)
编辑这里是一个变量,以保持编译器错误行号等准确:它将每个扩展行转换为"..."+\n(并正确处理字符串的第一行和最后一行):
sed ':a { $!N; s/\\\n/\\n"+\n"/; ta }'
Run Code Online (Sandbox Code Playgroud)
赠送:
System.out.println("convert trailing backslashes\n"+
"this is on another line\n"+
"\n"+
"\n"+
"above are two blank lines\n"+
"But don't convert non-trailing backslashes, like: \"\t\" and \'\\\'");
Run Code Online (Sandbox Code Playgroud)
编辑实际上,最好是使用Perl/Python风格的多行,它在一行上以特殊代码开头和结尾(对于python,我认为是"").
是否有更简单,更安全,更清晰的方式(可能不使用sed)?
是否有更简单,更安全,更清晰的方式.
忘记预处理器,忍受限制,抱怨它(这样它可能会在Java 7或8中修复),并使用IDE来缓解痛苦.
其他替代方案(我认为太麻烦了,但仍然比编译过程更糟糕):