如何在每次都不修复字符串长度时使用Substring

时间:2016-01-10 14:34:34

标签: java string

我有类似的字符串:

SKU: XP321654
Quantity: 1
Order date: 01/08/2016

SKU长度不固定,所以我的函数有时会返回数量的前两个字符,我也不想这样做。我想只获得SKU值。

我的代码:

int index = Content.indexOf("SKU:");
String SKU = Content.substring(index, index+15);

如果SKU有一个或两个以上的数字,那么它也无法获得,因为我已经指定了15的限制。如果我索引+ 16 来获取长SKU数据,那么对于短SKU,它也会返回一些数量的字符。

我该如何解决?有没有办法使用而不是静态字符串字符长度作为限制。

我的SKU最后一位数字总是会编号,所以我可以使用其他任何东西只能获得SKU直到它的最后一位数?

4 个答案:

答案 0 :(得分:2)

使用.substring根本不是处理此类事情的方法。你需要的是一个正则表达式(或正则表达式):

Pattern pat = Pattern.compile("SKU\\s*:\\s*(\\S+)");
String sku = null;

Matcher matcher = pattern.matcher(Content);
if(matcher.find()) {  //we've found a match
    sku = matcher.group(1);
}
//do something with sku

未正式使用正则表达式:

SKU\s*:\s*(\S+)

因此,您正在寻找以SKU开头,然后是零或更多\s(空格和制表符之间的间距字符),然后是冒号(:)的模式可能是零个或多个间距字符(\s),最后是您感兴趣的部分:一个或多个(+的意思)非间距字符(\S)。通过将它们放在括号中,这些是匹配组。如果正则表达式成功找到模式(matcher.find()),则可以提取匹配组matcher.group(1)的内容并将其存储到字符串中。

如果你更了解SKU的外观,你可以进一步提高正则表达式 。例如,如果它只包含大写字母和数字,则可以将\S替换为[0-9A-Z],然后模式变为:

Pattern pat = Pattern.compile("SKU\\s*:\\s*([0-9A-Z]+)");

编辑:对于数量数据,您可以使用:

Pattern pat2 = Pattern.compile("Quantity\\s*:\\s*(\\d+)");
int qt = -1;

Matcher matcher = pat2.matcher(Content);
if(matcher.find()) {  //we've found a match
    qt = Integer.parseInt(matcher.group(1));
}

或查看this jdoodle

答案 1 :(得分:1)

你知道你可以直接引用字符串的长度吗?

String s   = "SKU: XP321654";
String sku = s.substring(4, s.length()).trim();

我认为在这种情况下使用正则表达式显然有点过头了,它比这简单得多。您甚至可以拆分表达式,虽然它比上面的解决方案效率低一点,但请不要使用正则表达式!

String sku = "SKU: XP321654".split(':')[1].trim();

答案 2 :(得分:0)

1:你必须按行拆分输入(或用\ n分割

2:当你有你的行时:你搜索:然后你取剩余的行(用Dici答案中提到的字符串大小)。

答案 3 :(得分:0)

根据字符串包含新行的确切方式,您可以执行以下操作:

public static void main(String[] args) {

    String s = "SKU: XP321654\r\n" + 
               "Quantity: 1\r\n" + 
               "Order date: 01/08/2016";

    System.out.println(s.substring(s.indexOf(": ") + 2, s.indexOf("\r\n")));
}

请注意,这个1-liner有几个限制:

  • SKU属性必须是第一个。如果没有,则适当修改起始索引以搜索"SKU: "
  • 新行可能会分开,否则\R是所有有效新行转义字符组合的正则表达式。