在JavaScript中,我们可以在每个第3个字符处拆分字符串
"foobarspam".match(/.{1,3}/g)
我试图弄清楚如何在Java中这样做。有什么指针吗?
你可以这样做:
String s = "1234567890";
System.out.println(java.util.Arrays.toString(s.split("(?<=\\G...)")));
产生:
[123, 456, 789, 0]
正则表达式(?<=\G...)
匹配一个空字符串,其中包含最后一个匹配项(\G
),后跟三个字符(...
)((?<= )
)
Java不提供功能非常全面的拆分实用程序,因此Guava libraries可以:
Iterable<String> pieces = Splitter.fixedLength(3).split(string);
看看Javadoc for Splitter;它非常强大。
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
for (String part : getParts("foobarspam", 3)) {
System.out.println(part);
}
}
private static List<String> getParts(String string, int partitionSize) {
List<String> parts = new ArrayList<String>();
int len = string.length();
for (int i=0; i<len; i+=partitionSize)
{
parts.add(string.substring(i, Math.min(len, i + partitionSize)));
}
return parts;
}
}
作为Bart Kiers答案的补充,我想补充说,有可能代替在正则表达式中使用三个点...
代表三个字符,你可以写出具有相同含义的.{3}
。
然后代码如下所示:
String bitstream = "00101010001001010100101010100101010101001010100001010101010010101";
System.out.println(java.util.Arrays.toString(bitstream.split("(?<=\\G.{3})")));
使用它可以更容易地修改字符串长度,并且现在使用可变输入字符串长度来创建函数是合理的。可以这样做,如下所示:
public static String[] splitAfterNChars(String input, int splitLen){
return input.split(String.format("(?<=\\G.{%1$d})", splitLen));
}
IdeOne中的一个例子:http://ideone.com/rNlTj5
迟入。
以下是使用Java8流的简洁实现,一个内容:
String foobarspam = "foobarspam";
AtomicInteger splitCounter = new AtomicInteger(0);
Collection<String> splittedStrings = foobarspam
.chars()
.mapToObj(_char -> String.valueOf((char)_char))
.collect(Collectors.groupingBy(stringChar -> splitCounter.getAndIncrement() / 3
,Collectors.joining()))
.values();
输出:
[foo, bar, spa, m]
这是一个迟到的答案,但无论如何我都会把它放在那里让任何新的程序员看到:
如果您不想使用正则表达式,并且不希望依赖第三方库,则可以使用此方法,在2.80 GHz CPU(小于1毫秒)内需要89920到100113纳秒。它不像西蒙尼克森的例子那么漂亮,但它有效:
/**
* Divides the given string into substrings each consisting of the provided
* length(s).
*
* @param string
* the string to split.
* @param defaultLength
* the default length used for any extra substrings. If set to
* <code>0</code>, the last substring will start at the sum of
* <code>lengths</code> and end at the end of <code>string</code>.
* @param lengths
* the lengths of each substring in order. If any substring is not
* provided a length, it will use <code>defaultLength</code>.
* @return the array of strings computed by splitting this string into the given
* substring lengths.
*/
public static String[] divideString(String string, int defaultLength, int... lengths) {
java.util.ArrayList<String> parts = new java.util.ArrayList<String>();
if (lengths.length == 0) {
parts.add(string.substring(0, defaultLength));
string = string.substring(defaultLength);
while (string.length() > 0) {
if (string.length() < defaultLength) {
parts.add(string);
break;
}
parts.add(string.substring(0, defaultLength));
string = string.substring(defaultLength);
}
} else {
for (int i = 0, temp; i < lengths.length; i++) {
temp = lengths[i];
if (string.length() < temp) {
parts.add(string);
break;
}
parts.add(string.substring(0, temp));
string = string.substring(temp);
}
while (string.length() > 0) {
if (string.length() < defaultLength || defaultLength <= 0) {
parts.add(string);
break;
}
parts.add(string.substring(0, defaultLength));
string = string.substring(defaultLength);
}
}
return parts.toArray(new String[parts.size()]);
}
您还可以在每个第n个字符处拆分一个字符串,并将它们分别放在List的每个索引中:
这里我列出了一个名为Sequence的字符串列表:
List <String>序列
然后我基本上每2个字拆分字符串“KILOSO”。所以'KI''LO''SO'将被合并到名为Sequence的List的单独索引中。
字符串S = KILOSO
Sequence = Arrays.asList(S.split(“(?<= \ G ..)”));
所以,当我在做的时候:
是System.out.print(序列)
它应该打印:
[带,睡觉]
验证我可以写:
是System.out.print(Sequence.get(1))
它将打印:
LO