在Java中使用分隔符“标记问题”。 ” - java

我需要使用分隔符". "分割文本。例如我想要这个字符串:

Washington is the U.S Capital. Barack is living there.

分为两部分:

Washington is the U.S Capital. 
Barack is living there.

这是我的代码:

// Initialize the tokenizer
StringTokenizer tokenizer = new StringTokenizer("Washington is the U.S Capital. Barack is living there.", ". ");
 while (tokenizer.hasMoreTokens()) {
      System.out.println(tokenizer.nextToken());

}

和不幸的是输出:

Washington
is
the
U
S
Capital
Barack
is
living
there

有人可以解释发生了什么吗?

参考方案

不要使用StringTokenizer;这是一个遗留类。使用java.util.Scanner或仅使用String.split代替。

    String text = "Washington is the U.S Capital. Barack is living there.";
    String[] tokens = text.split("\\. ");
    for (String token : tokens) {
        System.out.println("[" + token + "]");
    }

打印:

[Washington is the U.S Capital]
[Barack is living there.]

请注意,splitScanner是基于“正则表达式”的(正则表达式),并且由于.是特殊的正则表达式“元字符”,因此需要使用\对其进行转义。反过来,由于\本身是Java字符串文字的转义字符,因此您需要编写"\\. "作为分隔符。

这听起来可能很复杂,但实际上并非如此。 splitScanner优于StringTokenizer,而regex并不难掌握。

正则表达式教程

Java Lessons/Regular expressions
regular-expressions.info-非常好的教程,不是特定于Java的

相关问题

Scanner vs. StringTokenizer vs. String.Split

API链接

java.util.StringTokenizer

StringTokenizer是一个遗留类,出于兼容性原因而保留,尽管在新代码中不建议使用。建议寻求此功能的任何人改用splitString方法或java.util.regex包。

java.util.Scanner

一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。
Java Tutorials - Basic I/O - Scanning and formatting

String[] String.split

围绕给定正则表达式的匹配项拆分此字符串。

但是出了什么问题?

问题是StringTokenizer将分隔符字符串中的每个字符都用作单独的分隔符,即不是整个String本身。

从API:

StringTokenizer(String str, String delim):为指定的字符串构造一个字符串标记器。 delim参数中的字符是用于分隔标记的定界符。分隔符本身不会被视为标记。

Java:找到特定字符并获取子字符串 - java

我有一个字符串4.9.14_05_29_16_21,我只需要获取4.9。数字各不相同,所以我不能简单地获得此char数组的前三个元素。我必须找到最正确的.并将其子字符串化直到那里。我来自Python,因此我将展示Python的实现方法。def foobar(some_string): location = some_string.rfind('.&…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java DefaultSslContextFactory密钥库动态更新 - java

我有一个使用org.restlet.engine.ssl.DefaultSslContextFactory的现有应用程序和一个在服务器启动时加载的密钥库文件。我有另一个应用程序,该应用程序创建必须添加的证书服务器运行时动态地更新到密钥库文件。为此,我在代码中创建了证书和私钥,然后将其写入到目录。该目录由bash脚本监视,该脚本检查是否有新文件,如果出现,它将…