特长的string如何从一行变多行?

我想问如果从数据库取出的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());

这种问题用正则表达式怎么样呢?