在Java中获取字符串的子串。

6
我有以下文本:

...,Niedersachsen,自2009年3月起不再负责,类别:...

现在我想提取在“自此之后不再负责”之后的日期,直到逗号为止。 所以我只需要03.2009作为我的子字符串结果。
那么我该怎么处理呢?
String substr = "not in charge since:";
String before = s.substring(0, s.indexOf(substr));
String after = s.substring(s.indexOf(substr),s.lastIndexOf(","));

编辑

for (String s : split) {
    s = s.toLowerCase();
    if (s.contains("ex peps")) {
        String substr = "not in charge since:";
        String before = s.substring(0, s.indexOf(substr));
        String after = s.substring(s.indexOf(substr), s.lastIndexOf(","));

        System.out.println(before);
        System.out.println(after);
        System.out.println("PEP!!!");
    } else {
        System.out.println("Line ok");
    }
}

但这不是我想要的结果。

2
"String.substring" 是区分大小写的,所以在你的例子中,substrs 中是找不到的。(https://dev59.com/c3NA5IYBdhLWcg3wAI7e) - Sentry
已经编辑了我的帖子。 - Captai-N
1
@Captai-N,你可能应该考虑使用正则表达式。这样更高效、易读。 - dumbPotato21
你的问题在于使用了 lastIndexOf(",")。如果 SINCE 后面的字符串包含多个 ,,它将无法正常工作。你应该在 SINCE 后的子字符串中获取第一个 , 的索引。 - Jeremy Grand
2
@Shashwat 好的。如果该字符串中没有其他冒号,则简单的 indexOf(':') 将胜过任何正则表达式,性能更佳。 - GhostCat
显示剩余2条评论
6个回答

8
你可以使用模式,例如:
String str = "Niedersachsen,NOT IN CHARGE SINCE: 03.2009, CATEGORY";
Pattern p = Pattern.compile("\\d{2}\\.\\d{4}");
Matcher m = p.matcher(str);

if (m.find()) {
    System.out.println(m.group());
}

输出

03.2009

注意:如果您想在所有字符串中获取类似的日期,可以使用while代替if。
编辑:
或者您可以使用:
String str = "Niedersachsen,NOT IN CHARGE SINCE: 03.03.2009, CATEGORY";
Pattern p = Pattern.compile("SINCE:(.*?)\\,");
Matcher m = p.matcher(str);

if (m.find()) {
    System.out.println(m.group(1).trim());
}

谢谢您的建议,目前看来它是有效的。但是日期也可以是完整的日期格式,例如01.03.2009。 - Captai-N

4
你可以使用 : 来分隔 String s。
String substr = "NOT IN CHARGE SINCE:";
String before = s.substring(0, s.indexOf(substr)+1);
String after = s.substring(s.indexOf(':')+1, s.lastIndexOf(','));

4
当然,正则表达式为你提供了更多的搜索/匹配方式,但假设":"是你要查找的关键内容(并且它在该位置恰好出现一次),则:
s.substring(s.indexOf(':')+1, s.lastIndexOf(',')).trim();

这是获取子字符串的“最简单”和“开销最小”的方式。

提示:由于您正在搜索一个单字符,因此请使用一个字符作为搜索模式,而不是一个字符串!


1
有道理...但他的问题并不是很清楚。他想要数字还是带有尾随空格的字符串呢?;-) - GhostCat

1
如果您有一个更通用的用例,并且您很好地了解要匹配的文本结构,那么您可能会从使用正则表达式中受益:
Pattern pattern = Pattern.compile(".*NOT IN CHARGE SINCE: \([0-9.]*\),");
Matcher matcher = pattern.matcher(line);
System.out.println(matcher.group());

0

你需要为此创建一个模式。尝试使用这个简单的正则表达式作为起点,并随意进行改进:

String s = "...,Niedersachsen,NOT IN CHARGE SINCE: 03.2009, CATEGORY:....,";
Pattern pattern = Pattern.compile(".*NOT IN CHARGE SINCE: ([\\d\\.]*).*");
Matcher matcher = pattern.matcher(s);

if (matcher.find())
{
    System.out.println(matcher.group(1));
}

这将使你得到你作为日期接收到的数字组。


0
解决您的问题的更通用的方法是使用正则表达式来匹配冒号和逗号之间的每个组。
Pattern pattern = Pattern.compile("(?<=:)(.*?)(?=,)");
Matcher m = p.matcher(str);

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