如果我的文件包含以下内容:
11:17 GET this is my content #2013
11:18 GET this is my content #2014
11:19 GET this is my content #2015
如何使用Scanner
并忽略`String line = scanner.nextLine();?
我喜欢的结果是:
this is my content
this is my content
this is my content
所以我想从开始到GET旅行,然后把所有东西都带到#char。
这怎么可以轻松完成?
答案 0 :(得分:1)
您可以使用String.indexOf(String str)和String.indexOf(char ch)方法。例如:
String line = scanner.nextLine();
int start = line.indexOf("GET");
int end = line.indexOf('#');
String result = line.substring(start + 4, end);
答案 1 :(得分:0)
一种方式可能是
String strippedStart = scanner.nextLine().split(" ", 3)[2];
String result = strippedStart.substring(0, strippedStart.lastIndexOf("#")).trim();
这假设在开头总是两个空格分隔的标记(11:22 GET或11:33 POST,idk)。
答案 2 :(得分:0)
你可以这样做: -
String line ="11:17 GET this is my content #2013";
int startIndex = line.indexOf("GET ");
int endIndex = line.indexOf("#");
line = line.substring(startIndex+4, endIndex-1);
System.out.println(line);
答案 3 :(得分:0)
在我看来,针对您的问题的最佳解决方案是使用Java regex。使用正则表达式,您可以定义要检索的文本组或文本类型。我很长一段时间没有使用过Java,所以我会尽力帮助你。我会尽力给你一个正确的方向。
首先,编译一个模式:
Pattern pattern = Pattern.compile("^\d{1,2}:\d{1,2} GET (.*?) #\d+$", Pattern.MULTILINE);
正则表达式的第一部分表示您希望一个或两个数字后跟一个冒号后跟一个或两个数字。之后是GET(你可以使用GET | POST,如果你期望那些单词或\ w +?如果你期望任何单词)。然后使用括号定义所需的组。最后,您将散列和任意数量的数字至少包含一位数。您可以考虑将标记DOTALL和CASE_INSENSITIVE放入,但我认为您不需要它们。
然后继续使用匹配器:
Matcher matcher = pattern.matcher(textToParse);
while (matcher.find())
{
//extract groups here
String group = matcher.group(1);
}
在while
循环中,您可以使用matcher.group(1)
查找使用括号选择的组中的文本(您要提取的文本)。 matcher.group(0)
给出了整个查找,这不是您当前正在寻找的(我猜)。
对于代码中的任何错误,很抱歉,它尚未经过测试。希望这能让你走上正轨。
答案 4 :(得分:0)
您可以尝试这种相当灵活的解决方案:
Scanner s = new Scanner(new File("data"));
Pattern p = Pattern.compile("^(.+?)\\s+(.+?)\\s+(.*)\\s+(.+?)$");
Matcher m;
while (s.hasNextLine()) {
m = p.matcher(s.nextLine());
if (m.find()) {
System.out.println(m.group(3));
}
}
这段代码在打印之前忽略了每一行的第一,第二和最后一个单词。
优点是它依赖于空格而不是特定的字符串文字来执行剥离。