Emi*_*mil 114 java regex string split
如何"Thequickbrownfoxjumps"在Java 中将字符串拆分为相同大小的子字符串.例如."Thequickbrownfoxjumps"等于4的大小应该给出输出.
["Theq","uick","brow","nfox","jump","s"]
Run Code Online (Sandbox Code Playgroud)
类似问题:
Ala*_*ore 212
这是正则表达式的单行版本:
System.out.println(Arrays.toString(
"Thequickbrownfoxjumps".split("(?<=\\G.{4})")
));
Run Code Online (Sandbox Code Playgroud)
\G是一个零宽度断言,匹配上一个匹配结束的位置.如果是以前没有的比赛,它的输入的开始,同相匹配\A.封闭的lookbehind匹配从最后一个匹配结束开始的四个字符的位置.
两者都是lookbehind和\G高级正则表达式功能,并非所有口味都支持.此外,\G并没有在支持它的各种口味中实现一致.这个技巧(例如)可以在Java,Perl,.NET和JGSoft中使用,但不能在PHP(PCRE),Ruby 1.9+或TextMate(都是Oniguruma)中使用.JavaScript /y(粘性标记)不像它那样灵活\G,即使JS确实支持lookbehind也不能以这种方式使用.
我应该提一下,如果你有其他选择,我不一定会推荐这个解决方案.其他答案中的非正则表达式解决方案可能更长,但它们也是自我记录的; 这个与此恰恰相反.;)
此外,这在Android中不起作用,Android不支持\G在lookbehinds中使用.
Jon*_*eet 127
好吧,通过蛮力这样做很容易:
public static List<String> splitEqually(String text, int size) {
// Give the list the right capacity to start with. You could use an array
// instead if you wanted.
List<String> ret = new ArrayList<String>((text.length() + size - 1) / size);
for (int start = 0; start < text.length(); start += size) {
ret.add(text.substring(start, Math.min(text.length(), start + size)));
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
我认为使用正则表达式并不值得.
编辑:我不使用正则表达式的原因:
Sea*_*oyd 70
使用Google Guava非常容易:
for(final String token :
Splitter
.fixedLength(4)
.split("Thequickbrownfoxjumps")){
System.out.println(token);
}
Run Code Online (Sandbox Code Playgroud)
输出:
Theq
uick
brow
nfox
jump
s
Run Code Online (Sandbox Code Playgroud)
或者,如果您需要将结果作为数组,则可以使用以下代码:
String[] tokens =
Iterables.toArray(
Splitter
.fixedLength(4)
.split("Thequickbrownfoxjumps"),
String.class
);
Run Code Online (Sandbox Code Playgroud)
参考:
注意:拆分器结构如上所示,但由于拆分器是不可变的和可重用的,因此将它们存储在常量中是一种很好的做法:
private static final Splitter FOUR_LETTERS = Splitter.fixedLength(4);
// more code
for(final String token : FOUR_LETTERS.split("Thequickbrownfoxjumps")){
System.out.println(token);
}
Run Code Online (Sandbox Code Playgroud)
Cow*_*wan 13
如果你正在使用谷歌的guava通用库(而且老实说,任何新的Java项目可能都应该这样),这对于Splitter类来说是非常微不足道的:
for (String substring : Splitter.fixedLength(4).split(inputString)) {
doSomethingWith(substring);
}
Run Code Online (Sandbox Code Playgroud)
就是这样.很容易!
public static String[] split(String src, int len) {
String[] result = new String[(int)Math.ceil((double)src.length()/(double)len)];
for (int i=0; i<result.length; i++)
result[i] = src.substring(i*len, Math.min(src.length(), (i+1)*len));
return result;
}
Run Code Online (Sandbox Code Playgroud)
public String[] splitInParts(String s, int partLength)
{
int len = s.length();
// Number of parts
int nparts = (len + partLength - 1) / partLength;
String parts[] = new String[nparts];
// Break into parts
int offset= 0;
int i = 0;
while (i < nparts)
{
parts[i] = s.substring(offset, Math.min(offset + partLength, len));
offset += partLength;
i++;
}
return parts;
}
Run Code Online (Sandbox Code Playgroud)
这是一个单行版本,它使用Java 8 IntStream来确定切片开头的索引:
String x = "Thequickbrownfoxjumps";
String[] result = IntStream
.iterate(0, i -> i + 4)
.limit((int) Math.ceil(x.length() / 4.0))
.mapToObj(i ->
x.substring(i, Math.min(i + 4, x.length())
)
.toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)