【问题标题】:How to extract words from a string in Java如何从Java中的字符串中提取单词
【发布时间】:2014-12-17 23:31:34
【问题描述】:

我已经导入了一个文件并将其转换为一个名为 readFile 的字符串。该文件包含两行:

qwertyuiop00%
qwertyuiop

我已经使用以下方法从字符串中提取了“00”: 字符串编号 = readFile.substring(11, 13);

我现在想提取“qwertyuiop”中的“ert”和“uio” 当我尝试使用与第一种相同的方法时,如下所示:

String e = readFile.substring(16, 19);
String u = readFile.substring(20, 23);

并尝试使用:

System.out.println(e + "and" + u);

它说字符串索引超出范围。

我该怎么做? 是因为我想从字符串中提取的下两个单词在第二行吗? 如果是这样,我如何只提取第二行? 我想保持基本,谢谢。

更新: 原来只有文件的第一行被读取,有谁知道如何使它读取两行?

【问题讨论】:

  • It won't work. 究竟发生了什么?
  • 为什么不使用正则表达式作为子字符串?或者你为什么需要这个?也许如果您告诉我们您想解决的问题,我们可以给您一个简单的解决方案。
  • 您的第二行较短,您尝试将 10 个字符作为子字符串。你可以使用正则表达式。
  • 为什么不把每一行放到它自己的字符串中呢?为什么要将整个文件的内容组合成一个字符串?
  • 使用字符串分割器应该可以工作

标签: java string substring extract


【解决方案1】:

如果你计算每个字符串的字符总数,它们比你输入的索引要多。

qwertyuiop00% 是 13 个字符。在字符串上调用.length() 方法来验证长度是否符合您的预期。

我会在调试之前添加以下内容:

System.out.println(readFile);
System.out.println(readFile.length());

注意:

qwertyuiop00% qwertyuiop 是 24 个字符,因为空格算作一个字符。除非当然你没有 23 个字符的空间并且你的索引是 0 到 22

注意2:

我询问了解析器代码,因为我怀疑您使用的是通常的代码,类似于:

while ((line = reader.readLine()) != null)

您需要将这些行连接成一个字符串(尽管这不是最好的方法)。

见:How do I create a Java string from the contents of a file?

【讨论】:

  • qwertyuiop00% qwertyuiop 总共是 23 个字符?
  • 可以给我们解析代码吗?您是否也打印出这实际上是变量中的值?
  • 我认为他需要尽量避免错误,并且他可以测试子字符串是否存在:if(string.contains("uio"))
  • @hheather qwertyuiop00% qwertyuiop 是 24 个字符,因为空格算作一个字符。除非当然你没有 23 个字符的空间并且你的索引是 0 到 22
  • 我认为您在解析器中使用 readline(),这意味着您没有将两行都读入 1 个字符串。
【解决方案2】:

首先将你的字符串分成几行,你可以这样做

String[] lines = readFile.split("[\r\n]+");

您可能希望改用Files.#readAllLines 将内容直接读入List<String>

其次,不要使用硬编码索引,使用String#indexOf 找出它们。如果原始字符串中没有子字符串,则该方法返回-1,始终检查该值并仅在返回值不是-1(0 或更大)时调用substring

if(lines.length > 1) {
    int startIndex = lines[1].indexOf("ert");
    if(startIndex != -1) {
        // do what you want
    }
}

顺便说一句,从字符串中提取已知子字符串是没有意义的

System.out.println(e + "and" + u);

等价于

System.out.println("ertanduio");

知道固定子字符串的开始和结束位置只有在你想对原始字符串的其余部分做一些事情时才有意义,例如删除子字符串。

【讨论】:

【解决方案3】:

你可以试试这个:-

Scanner sc=new Scanner(new FileReader(new File(The file path for readFile.txt)));
String st="";
while(sc.hasNext()){
st=sc.next();
}
System.out.println(st.substring(2,5)+" "+"and"+" "+st.substring(6,9));

检查它是否有效。

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 2012-10-27
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多