我正在编写一个SML程序,我正在尝试将具有转义序列的字符串转换为没有转义序列的字符串。
我试过这个,但它似乎不起作用(只打印"Hello "
)
fun test x =
let val esc = "Hello \\ Bob \n Newman"
val fixed = String.fromString esc
in
print (valOf(fixed))
end
我想我可能不得不使用String.scan
函数,但我并不完全理解它是如何工作的。
功能签名是
scan : (char, 'a) StringCvt.reader
-> (string, 'a) StringCvt.reader
所以我有几个问题:
1)你能否解释这个扫描签名到底是什么意思...该函数采用什么参数以及它返回什么
2)这是我应该使用的功能吗?
3)您能否就使用此功能给我任何指导。感谢
编辑:好的,所以上面的例子我简化了,但我可能已经简化了太多......这正是我正在做的事情。我有一个名为str
的全局字符串和字符/字符串的输入流...当我读取输入流时,我将str
与我刚读过的字符连接起来。在我读完所有字符后,我想返回str
但是转换了所有转义序列。
答案 0 :(得分:1)
我刚刚解雇了PolyML并尝试了以下内容:
Poly/ML 5.5.0 Release
> val a = "Hello \\ Bob \n Newman";
val a = "Hello \\ Bob \n Newman": string
> print a;
Hello \ Bob
Newmanval it = (): unit
> print (String.toString a);
Hello \\ Bob \n Newmanval it = (): unit
>
换句话说,转义序列默认已经解释为它们所代表的字符,您必须使用String.toString
来“转义”特殊字符(获取包含原始转义序列的字符串)。或者,更好的是,您可以使用转义序列本身对转义序列进行编码,正如Andreas所示。
答案 1 :(得分:1)
您似乎对您的示例中发生的转义量感到困惑。
写作时
val s1 = "Hello \n world!"
然后,转义已由SML解析器解释,s1
本身在运行时不会包含任何转义。您可以按原样打印字符串。
实际上在运行时包含转义的字符串将是例如是
val s2 = "Hello \\n world!"
因为这里SML解析器将\\
解释为(单个)斜杠。然后,您可以使用s2
在运行时转换String.fromString
,生成与s1
相同的字符串。
回到你的例子,esc
表示运行时字符串
Hello \ Bob
Newman
斜线后跟空格。这不是一个有效的转义序列,因此String.fromString
仅将字符串转换为“解析”错误(即SML中所有fromString
函数的语义 - 如果使用底层scan
1}}直接运行,你也可以找回其余的字符串。)