在Java中获取定义字符串的实际长度

5

我已将String定义为

String s = "\\";
int length = s.length(); // returns 1
System.out.println(s); // prints only one "\"

如何使它的大小等于2

更新:问题不在于获取大小为2的字符串。我需要获取我定义字符串的源字符计数。


1
你尝试过打印字符串吗?只是为了确保你的理解是正确的吗? - TheLostMind
2
值得注意的是,无法区分定义为"\\"和定义为"\u005c"的字符串字面量,因为它们都表示相同的字符串;但是,在源代码中它们的长度不同。 - Andy Turner
1
@AndyTurner 这就是我所询问的。那么,没有办法获取我定义的字符串中字符的数量吗? - SeniorJD
1
它们是完全相同的字符串。完全无法区分。唯一的方法是通过解析源代码来实现。 - Andy Turner
@AndyTurner,不好意思,你能帮我一下吗?英语并不是我的母语。我已经在UPD部分尽力让它更清晰了。 - SeniorJD
显示剩余7条评论
4个回答

10

String s = "\\"; 包含的只是反斜杠字符 \,由于它是一个特殊字符,所以需要用反斜杠字符进行转义。

为了获得一个长度为2的字符串,你可以使用两个反斜杠进行转义,如下所示:

String s = "\\\\";

这个没有大小为4,而是2,因为有一些字符(比如反斜杠)在编辑器中并不是由单个可视元素表示的。

还有一些字符在打印时可能完全看不见(例如蒙古语元音分隔符),但在源代码中以不同的方式表示(使用它们的Unicode码)。例如,可以将蒙古语元音分隔符表示为:

String mongolianVowelSeparator = "\u180"; <-- one character only, invisible when printed

所以我们只有一个字符(Unicode字符U+180E),但是我们使用了五个编辑字符来表示它。


但是,在这种情况下,我需要得到4作为答案。 - SeniorJD
1
不,你应该明白在代码中有些字符是以字符序列的形式表示的。 - Konstantin Yovkov
@SeniorJD - 不,你不能这样做... \\ 在Java中具有特殊含义。它被视为 转义字符 - TheLostMind
@VinodMadyalkar 我认为你需要转义你的转义字符... ;) - Andy Turner
1
@AshwaniKumarRahul,我什么时候说过我是新手了? - SeniorJD
显示剩余2条评论

2
查看 JLS - 3.10.6. 转义字符序列用于字符和字符串字面量

字符和字符串转义序列允许表示一些非图形字符,以及在字符字面量(§3.10.4)和字符串字面量(§3.10.5)中表示单引号、双引号和反斜杠字符。

...

\ \ /* \u005c: 反斜杠 \ */

字符\Unicode 转义中使用:
除了语法所暗示的处理外,对于每个原始输入字符是反斜杠\,输入处理必须考虑到有多少其他的\字符连续地在它之前,将其与非\字符或输入流的开头分隔开。如果这个数字是偶数,则\符号可以用于开始一个Unicode转义;如果这个数字是奇数,则\符号不能用于开始一个Unicode转义。

值得一提的是,你的字符串可以写成:

\u005c

由于005c\的Unicode值。

2
使用DrJava中的CharConverter。您可以为您的项目调整源代码。它有一个方法,可以将字符串中所有转义字符转换回真实的Java输入。
String str1 = "\\";
String str2 = CharConverter.escapeString(str1);
System.out.println(str2.length());   // prints 2

-2
如上所述,反斜杠 "\" 是转义字符,不会增加字符串的总长度。但是,如果您坚持认为转义字符应该计入总长度,请尝试下面的代码片段。
对于您字符串中的每个 "\",将总长度增加一。
String s = "\\";
int length = s.length();

for(int i = 0; i < s.length; i++)
   if(s.charAt(i) == '\')
      length++;

我建议你有时候要运用一下自己的逻辑。无论如何,只需稍微修改一下代码: for(int i = 1; i < s.length; i++) if(s.charAt(i - 1) == ''' && s.charAt(i) == '') length++; - toliii
如果字符串是 "123\123",会怎么样? - SeniorJD
请重新表达您的请求。我几乎无法理解您的意思。 - toliii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接