【问题标题】:Java parsing a string with lots of whitespaceJava解析具有大量空格的字符串
【发布时间】:2012-02-14 21:32:09
【问题描述】:

我有一个带有多个空格的字符串,但是当我使用标记器时,它会在所有这些空格处将其分开。我需要令牌来包含这些空格。如何使用 StringTokenizer 来返回带有我要拆分的标记的值?

【问题讨论】:

  • 如果您不使用空格分隔的数据,您应该可以找到。如果你是,祝你好运!顺便说一句,如果你给我们一个例子会有所帮助。
  • 请举例说明您尝试标记的字符串以及您希望结果的外观。

标签: java string parsing tokenize


【解决方案1】:

您会在 StringTokenizer 的文档中注意到,建议不要将它用于任何新代码,而 String.split(regex) 正是您想要的

String foo = "this is      some  data      in   a string";
String[] bar = foo.split("\\s+");

编辑添加: 或者,如果您有比简单拆分更大的需求,则使用PatternMatcher 类进行更复杂的正则表达式匹配和提取。

再次编辑:如果您想节省空间,了解一些正则表达式真的很有帮助:

String[] bar = foo.split("\\b+");

这将在单词边界上拆分,将每个单词之间的空格保留为String

public static void main( String[] args )
{
    String foo = "this is      some  data      in   a string";
    String[] bar = foo.split("\\b");
    for (String s : bar)
    {
        System.out.print(s);
        if (s.matches("^\\s+$"))
        {
            System.out.println("\t<< " + s.length() + " spaces");
        }
        else
        {
            System.out.println();
        }
    }
}

输出:

this
        << 1 spaces
is
        << 6 spaces
some
        << 2 spaces
data
        << 6 spaces
in
        << 3 spaces
a
        << 1 spaces
string

【讨论】:

  • 这会拆分字符串,但保留空格。
  • @TravisJ - OP 的问题没有提供足够的细节来为他的问题提供精确的解决方案;我不知道他是否想要 N 个字符串,其中一些是单词之间的所有空格,或者他是否有“空”列由单词之间的一些空格表示,等等。另外,请参阅标记为“编辑添加"。
  • 如果您无法发布答案,那么也许您应该弃权。我将在已编辑的部分中提供适当的正则表达式解决方案。
  • @TravisJ - 哦不,谢谢;您鼓励我向 OP 提供一个实际上有效且正确的答案,如果那是他的实际需要的话。
  • @Brain Roach - 您可能希望使用高效且正确的方法,但在这里要更加小心。使用\b 分隔边界上的字符串可能会在存在非字符(如句点、美元符号、重音字母、撇号等)时产生意想不到的影响。用逻辑将所有这些重新组合起来效率非常低。
【解决方案2】:

听起来您可能需要使用正则表达式 (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/package-summary.html) 而不是 StringTokenizer

【讨论】:

    【解决方案3】:

    使用String.split("\\s+") 代替StringTokenizer

    请注意,这只会提取由至少一个空白字符分隔的 非空白 字符,如果您希望包含在非空白字符中的前导/尾随空白字符将是完全不同的解决办法!

    您的原始问题中并不清楚此要求,并且有一个待修改的编辑试图澄清它。

    StringTokenizer 在几乎所有非人为的情况下都是错误的工具。

    【讨论】:

      【解决方案4】:

      我认为最好先使用replaceAll 函数将所有多个空格替换为单个空格,然后使用split 函数进行标记化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-23
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        相关资源
        最近更新 更多