从Java中的String获取子串

时间:2017-05-17 12:12:29

标签: java string

我有以下文字:

  

...,Niedersachsen,自2003年3月以来不收费,类别:......,

现在我想在NOT IN CHARGE SINCE:之后提取日期,直到逗号。 所以我的子字符串只需要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");
    }
}

但那不是我想要的结果。

6 个答案:

答案 0 :(得分:7)

您可以使用模式,例如:

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());
}

答案 1 :(得分:3)

当然,正则表达式为您提供了更多的搜索/匹配方法,但假设“:”是您正在寻找的关键事物(并且在该位置显示完全一次)然后:

s.substring(s.indexOf(':')+1, s.lastIndexOf(',')).trim();

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

提示:当您搜索单个字符时,请使用字符作为搜索模式;不是一个字符串!

答案 2 :(得分:2)

您可以使用:分隔String

String substr = "NOT IN CHARGE SINCE:";
String before = s.substring(0, s.indexOf(substr)+1);
String after = s.substring(s.indexOf(':')+1, s.lastIndexOf(','));

答案 3 :(得分:1)

如果你有一个更通用的用例,并且你知道要匹配的文本结构,那么你可以从使用正则表达式中获益:

Pattern pattern = Pattern.compile(".*NOT IN CHARGE SINCE: \([0-9.]*\),");
Matcher matcher = pattern.matcher(line);
System.out.println(matcher.group());

答案 4 :(得分:0)

解决问题的一种更通用的方法是使用正则表达式匹配每个组之间:和,

Pattern pattern = Pattern.compile("(?<=:)(.*?)(?=,)");
Matcher m = p.matcher(str);

答案 5 :(得分: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));
}

这应该可以得到你在日期收到的任何数字组。