我有一个字符串
Product Description ID1 ID2 QTY Rate1 Rate2
我想把它打破
Product Description|ID1|ID2|QTY|Rate1|Rate2
我能看到的唯一常见分隔符是空格。但产品描述可以是任意数量的单词。所以我不知道它会有多少空间。但是字符串其余部分的空格是固定的。
目前我将它拆分为数组,得到它的长度并适当地连接。有更直接的方式吗?
答案 0 :(得分:2)
正常将其拆分为数组 最终将得到一个包含n + 5个组件的数组,其中n是产品说明中的单词数。
然后你知道:
Rate2 = arr[len-1]
Rate1 = arr[len-2]
QTY = arr[len-3]
ID2 = arr[len-4]
ID3 = arr[len-5]
然后将元素arr [0]与arr [len-6]组合在一起,在它们之间添加一个空格。这将为您提供产品说明。
或者你可以在输出数组上使用Collections.reverse(),但两种方法都得到相同的结果
答案 1 :(得分:2)
您的意思并不完全清楚"更直接",但我假设您要避免连接步骤。
一种方法如下:
使用Matcher.find(int)
进行初始传递以找到" N - 5th"的位置。分隔器。 (这需要int[]
包含5个元素,您可以将这些元素用作使用find
确定的偏移的一种队列。)
使用String.substring
提取分隔符前后的字符串
使用String.split
拆分第二个子字符串以分隔最后5个字段。
如果您保留偏移量和匹配长度(从第1步开始),您可以使用循环和split
来代替步骤3中的substring
来电。
(你通常不会分裂"向后"是因为正则表达式无法向后匹配。或者更确切地说,如果你这样做,你最终可能会以不同的方式分裂到你做的时候"前进"。这使得避免做2次传递变得非常重要。显然,在你的特定情况下,分隔符正则表达式将是"一个或多个空格"它可以在两个方向......如果有能力在Matcher API中做到这一点。)。
答案 2 :(得分:1)
使用StringBuilder,这可能是您可以获得的紧凑。好消息是你不必经常处理很多指数。事实上,你不必耍弄任何人。
String foo = "Product Description Test Potato ID1 ID2 QTY Rate1 Rate2 ";
foo = foo.trim(); // get rid of any extra spaces, in case we have any, as a safety check
//the code that does your work
StringBuilder bar = new StringBuilder(foo);
// we have to add the pipe 5 times
for (int i = 5; i > 0; i--) {
bar.setCharAt(bar.lastIndexOf(" "), '|');
}
foo = bar.toString();
答案 3 :(得分:1)
// Product Description ID1 ID2 QTY Rate1 Rate2
// Product Description|ID1|ID2|QTY|Rate1|Rate2
String actWord = "Product it a middle data Description ID1 ID2 QTY Rate1 Rate2";
String outputWord = null;
String[] arr = actWord.split(" ");
StringBuffer buf = new StringBuffer();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i] + "=" + (i < arr.length - 5));
if (i < arr.length - 5) {
buf.append(arr[i] + " ");
} else
buf.append("|" + arr[i]);
}
System.out.println("output - " + buf.toString().trim());
我希望这能解决你的需求。
答案 4 :(得分:-1)
反向,字符串。
根据空间进行解析/拆分。
将所有单词从解析/分割单词集中拉出来时重新反转所有单词。
不是超级优雅,但应该有效。