我想问如果从数据库取出的String非常长,要如何把String分成多行写呢?
如要把
"xxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xxxxxxxxxxx"变成
output 如下:
xxxxxxxxx xxxxxxxxxxxx
xxxxxxxxxxxx xxxxxxxxxx
xxxxxxxxxxx xxxxxxxxxxxx
xxxxxxxxxx xxxxxxxxxxx
这个程序要如何写呢?有代码参考吗?谢谢!
[b]问题补充:[/b]
字符长度大概30
[b]问题补充:[/b]
字符长度大概30 然后跳去下一行
[b]问题补充:[/b]
对不起,我要的大概是这样:
String="Hihi,how are you?I am fine. Thank you."
output:
Hihi,how are
you?I am fine.
Thank you."
但是string的内容是从database取出的
[b]问题补充:[/b]
但是for (String s : array) {
System.out.println(s);
} 有错误!
[b]问题补充:[/b]
因为我做reporting,所以要在服务器端进行,要取出资料!
[code="java"]
String[] strs = str.split(" ");
int length = 0;
StringBuffer sb = new StringBuffer();
for(int i=0;i length+=strs[i].length();
if(length>20){
sb.append("\n");
length = 0;
}
sb.append(" "+strs[i]);
}
System.out.println(sb.toString());
[/code]
看起来跟这个问题一样:[url]http://www.iteye.com/problems/14565[/url]
哦不,看错了……忽略上一条。
你的字符串里有没有规律?如果可以任意截断的话,可以通过split来对字串做定长分割
具体代码就像这样:
[code="java"]import java.util.regex.*;
public class Demo {
public static void main(String[] args) {
String str = "0123456789abcdef";
String[] array = str.split("(?<=\G.{5})(?=.)");
for (String s : array) {
System.out.println(s);
}
}
}
/* 输出:
01234
56789
abcde
f
*/[/code]
哦,30啊。那就把上一楼的{5}换成{30}就行。不过要留意,这个是任意截断的,不会在“单词”的中间截断。要对单词边界敏感的话再加点条件判断吧。
这样就好:
[code="java"]String[] array = str.split("(?<=\G.{30})");[/code]
今天果然状态不好……
[quote="RednaxelaFX"]不过要留意,这个是任意截断的,不会在“单词”的中间截断。要对单词边界敏感的话再加点条件判断吧。[/quote]
我是想说这么些对单词边界不敏感,所以有可能在单词中间截断。不介意的话那就直接用上面那句代码就行。
先上个简单版本的:
[code="ruby"]
str="xxxxxxxxx xxxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xxxxxxxxxxx xxxxxxxxxxxx xxxxxxxxxx xxxxxxxxxxx"
class String
def warp(width=30)
self.gsub(/(.{1,#{width}})(\s+|\Z)/, "\1\n")
end
end
puts str.warp
结果:
xxxxxxxxx xxxxxxxxxxxx
xxxxxxxxxxxx xxxxxxxxxx
xxxxxxxxxxx xxxxxxxxxxxx
xxxxxxxxxx xxxxxxxxxxx
[/code]
[code="java"]import java.util.regex.*;
public class Demo {
public static void main(String[] args) {
String str = "Hihi,how are you?I am fine. Thank you.";
String[] array = str.split("(?<=\G.{12,}\b)\s*");
for (String s : array) {
System.out.println(s);
}
}
}
/* 输出:
Hihi,how are
you?I am fine
. Thank you.
*/[/code]
做边界判断也不麻烦……这个代码是最短12字符,如果12字符还没到边界就继续向后找到边界为止。
如果你是要以行最多30字符,如果30字符不在边界上就提前截断的话……我现在懒得想了,呃呵呵 =v=
楼主是想把长文本截断吧?
请看这里:[url]http://www.douban.com/group/topic/4762660/[/url]
正常情况这是用html和css的相关方法解决的,不必在服务器端进行。
或者你在texteara里面就应该设置warp属性,就不至于数据库中的数据是那么长的了。
[quote="qqmeme"][b]问题补充:[/b]
但是for (String s : array) {
System.out.println(s);
} 有错误![/quote]
如果是编译错误的话……楼主用的编译器肯定是不支持Java 1.5语法的编译器了。换回普通的for循环就行。
[quote="Hooopo"]楼主是想把长文本截断吧?
请看这里:http://www.douban.com/group/topic/4762660/
正常情况这是用html和css的相关方法解决的,不必在服务器端进行。
或者你在texteara里面就应该设置warp属性,就不至于数据库中的数据是那么长的了。[/quote]
同感,没必要的话这种截断的工作别自己做。如果你是在GUI组件上输出文本的话,一般能显示多行文本的组件都有warp相关的属性,把它设上就行。
[code="objective-c"]
(NSArray*)splitMessage:(NSString*)message withMaxLength:(NSInteger)maxLength
{
NSString *subMessage = message;
NSMutableArray *msgs = [NSMutableArray new];
while(YES)
{
if([subMessage length] > maxLength)
{
unichar nextFirstChar = [subMessage characterAtIndex:maxLength + 1];
if(nextFirstChar > 254) // nextFirstChar is not 1 byte character
{
NBLog(@"msgs add = %@", [subMessage substringToIndex:maxLength]);
[msgs addObject:[subMessage substringToIndex:maxLength]];
subMessage = [subMessage substringFromIndex:maxLength];
NBLog(@"subMessage = %@", subMessage);
}
else
{
int i = 0;
while(YES)
{
unichar previousChar = [subMessage characterAtIndex:maxLength - i++];
if(previousChar > 254 || previousChar == 32) // previousChar is not 1 byte character or space character
{
i -= 2; // place the index of MAX_LENGTH_PER_MESSAGE - i character to the previous message
break;
}
}
NBLog(@"msgs add = %@", [subMessage substringToIndex:maxLength - i]);
[msgs addObject:[subMessage substringToIndex:maxLength - i]];
subMessage = [subMessage substringFromIndex:maxLength - i];
NBLog(@"subMessage = %@", subMessage);
}
}
else
{
[msgs addObject:subMessage];
break;
}
}
return [msgs autorelease];
}
[/code]
昨天处理同样问题用oc写的,你可以当伪码,自己对着java字符串的api转换一下就行了
每行最后单词可分开
[code="java"]
String str = "Hihi,how are you?I am fine. Thank you.";
StringBuffer sb = new StringBuffer();
char[] chars = str.toCharArray();
for(int i=0;i if(i%30==0){
sb.append("\n");
}
sb.append(chars[i]);
}
System.out.println(sb.toString());
[/code]
每行最后一个单词不可分开
[code="java"]
String[] strs = str.split(" ");
int length = 0;
StringBuffer sb = new StringBuffer();
for(int i=0;i length+=strs[i].length();
if(length>20){
sb.append("\n");
length = 0;
}
sb.append(" "+strs[i]);
}
System.out.println(sb.toString());
[/code]
楼上第二种硬给每行开头都加了空格……不用正则表达式非要自己来循环,也没必要用toCharArray,直接线性扫描就行。toCharArray要复制一份数组,直接charAt不用。
String[] strs = str.split(" ");
int length = 0;
StringBuffer sb = new StringBuffer();
for(int i=0;i length+=strs[i].length();
if(length>20){
sb.append("\n");
length = 0;
}
sb.append(" "+strs[i]);
}
System.out.println(sb.toString());
这种问题用正则表达式怎么样呢?