我有类似的字符串:
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
直到它的最后一位数?
答案 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
是所有有效新行转义字符组合的正则表达式。