【问题标题】:Take string "asdxyz\n" and replace \n with the ascii value取字符串 "asdxyz\n" 并将 \n 替换为 ascii 值
【发布时间】:2009-02-11 02:48:58
【问题描述】:

我不想用 /u000A 替换它,不希望它看起来像“asdxyz/u000A”

我想用实际的换行符替换它。

【问题讨论】:

  • 安德鲁,我相信你的问题不清楚。您可能需要稍微澄清一下,例如,您有字符 'a'、's'、'd'、'x'、'y'、'z'、'\'、'n' 并且你想要 ' a','s','d','x','y','z','\n'。

标签: java apache-flex compiler-construction


【解决方案1】:

根据您对Natso's answer 的回复,您似乎对正在发生的事情存在根本性的误解。两个字符序列\n 不是换行符。但这是我们在代码中表示该字符的方式,因为实际字符很难看到。编译器知道,当它在字符串文字的上下文中遇到该两个字符序列时,它应该将它们解释为真正的换行符,其 ASCII 值为 10。

如果您将该两个字符序列打印到控制台,您将看不到它们。相反,您会看到光标前进到下一行。那是因为编译器已经用换行符替换了这两个字符,所以实际上是换行符被发送到控制台。

如果您的程序有 input,其中包含反斜杠和小写 N,并且您想将它们转换为换行符,那么 Zach's answer 可能就足够了。但是,如果您希望您的程序在输入中允许使用真正的反斜杠,那么您需要某种方式让输入表明反斜杠后跟小写 N 确实应该是这两个字符。通常的做法是在反斜杠前面加上另一个反斜杠,转义。如果您在这种情况下使用 Zach 的代码,您最终可能会将三个字符序列 \\n 转换为由反斜杠后跟换行符组成的两个字符序列。

读取使用反斜杠转义的字符串的可靠方法是从输入的开头开始一次解析一个字符。将字符从输入复制到输出,除非遇到反斜杠。在这种情况下,也要检查下一个字符是什么。如果是另一个反斜杠,请将一个反斜杠复制到输出。如果是小写 N,则在输出中写入换行符。如果它是任何其他角色,那么无论您定义什么都是正确的。 (示例包括将整个输入视为错误而拒绝,假装反斜杠不存在,以及省略反斜杠和后面的字符。)

如果您尝试在调试器中观察变量的内容,则调试器可能会检测到换行符,将其返回转换为两个字符序列\n .因此,如果您单步调试代码试图找出其中的内容,您可能会成为调试器帮助的牺牲品。在大多数情况下,它确实很有帮助。程序员通常想知道字符串中有哪些字符。他们不太关心这些角色将如何出现在屏幕上。

【讨论】:

  • 实际上正在为编译器课程做一个项目,这是词法分析器的一部分。我们正在使用 bantam java。当 lexeeme 作为字符串匹配时,我们希望返回该字符串的实际值,包括特殊字符 /t、/n、/f 等。
  • 在这种情况下,我的第四段就是你所需要的。 String.replace 有时会起作用,但不足以让您在项目中获得好成绩(至少,如果我是给它评分的人,则不会)。
  • 是的,我们正试图准确地做到这一点,我不记得为什么我们放弃了更换的想法。我们将重新审视它并再试一次。
【解决方案2】:

只需使用String.replace():

newtext = text.replace("\\n", "\n");

【讨论】:

  • +1 因为我假设这就是 Q'er 想要的(“\n”已经是换行符)。
【解决方案3】:

使用“(char)(10)”代码生成真正的ascii值。

newstr = oldstr.replaceAll("\\n",(char)(10));

// -or-

newstr = oldstr.replaceAll("\\n","" + ((char)(10)));

//(有一段时间了)

【讨论】:

  • 认为可能是这样,但它似乎将“\n”放入字符串中,就像我会做的那样:newstr = oldstr.replaceAll("\\n","\ n");
  • 这些都是错误的。第一个参数是一个正则表达式,反斜杠 + 'n'(作为 Java 字符串文字)的正则表达式是“\\\\n”。至于替换,(char)(10) 不会编译,""+(char)(10) 和 "\n" 一样。
猜你喜欢
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多