日期:2014-05-20 浏览次数:21104 次
package csdn;
/**
*
* @author wyy
* on 12.02.26
*
*/
public class Stringtest1 {
public static void main(String[] args) {
String string = "we are2 at 2the b2222b web ";
String[] ss= string.split(" ");
StringBuffer sBuffer = new StringBuffer();
for(String s :ss){
sBuffer.append(upperFirstAndAddUnderline(s)+' ');
}
System.out.println(sBuffer);
}
public static String upperFirstAndAddUnderline(String string){
StringBuffer sBuffer = new StringBuffer();
if(string!=null){
//判断上一个字母是否是数字
boolean bool = false;
for(int i=0;i<string.length();i++){
if(i==0){
//System.out.println(Character.toUpperCase(string.charAt(0)));
sBuffer.append(Character.toUpperCase(string.charAt(0)));
}else if(Character.isDigit(string.charAt(i))){
if(bool){
sBuffer.append(string.charAt(i));
}else{
sBuffer.append("_"+string.charAt(i));
bool = true;
}
}else{
if(bool){
sBuffer.append("_"+string.charAt(i));
}else{
sBuffer.append(string.charAt(i));
}
bool = false;
}
}
}
return sBuffer.toString();
}
}
------解决方案--------------------
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 要求:用户输入一串单词(不超过50个字符),
* 如 we are at the b2b web 编程实现:
* 每个单词首字母大写
* 多个空格只输出一个
* 数字与字符之间要用“_”间隔
* 即输出: We Are At The B_2_b Web 大家帮忙看一下呗!
*
* 思路:
* 1. 替换空格
* 2. 构建一个StringBuilder,用于存储从原字符串中截取的子字符串
* 3. 创建一个匹配数字的Matcher
* 4. 每匹配到一次执行以下四步
* 4.1. 截取上一次匹配处到这次匹配处之间的字符串,append到StringBuilder对象中
* 4.2. 如果匹配到的数字前面有没有空格,则将一个"_"append到StringBuilder对象中
* 4.3. 将匹配到的数字append到StringBuilder对象中
* 4.4. 如果匹配到的数字后面有没有空格,则将一个"_"append到StringBuilder对象中
* 5. 将剩下的字符串截取出来append到StringBuilder对象中
* 6. 创建一个存储最终结果的StringBuilder对象
* 7. 以空格为分割,切割替换空格和数字之后的字符串
* 8. 将每一个切割出来的子字符串转换为字符数组,判断第一个字符是否为小写字母,如果是,
* 则转换为大写字母,然后将该字符数组存储到存储最终结果的StringBuilder对象中
* @author wlxxsj
*
*/
public class WordDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String srcWord = sc.nextLine();
sc.close();
//1. 替换空格
srcWord = srcWord.replaceAll(" {2,}", " ");
//2. 构建一个StringBuilder,用于存储从原字符串中截取的子字符串
StringBuilder numReplaced = new StringBuilder();
//3. 创建一个匹配数字的Matcher
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(srcWord);
//4. 替换数字
int startIndex = 0;
int matchedStartIndex = 0, matchedEndIndex = 0;
while (m.find()) {
matchedStartIndex = m.start();
matchedEndIndex = m.end();
//4.1. 截取上一次匹配处到这次匹配处之间的字符串,append到StringBuilder对象中
numReplaced.append(srcWord.substring(startIndex, matchedStartIndex));
//4.2. 如果匹配到的数字前面有没有空格,则将一个"_"append到StringBuilder对象中
if (matchedStartIndex > 0 && srcWord.charAt(matchedStartIndex-1) != ' ') {
numReplaced.append("_");
}
//4.3. 将匹配到的数字append到StringBuilder对象中
numReplaced.append(m.group());
//4.4. 如果匹配到的数字后面有没有空格,则将一个"_"append到StringBuilder对象中
if (matchedEndIndex < srcWord.length() && srcWord.charAt(matchedEndIndex) != ' ') {
numReplaced.append("_");
}
startIndex = matchedEndIndex;
}
//5. 将剩下的字符串截取出来append到StringBuilder对象中
numReplaced.append(srcWord.substring(matchedEndIndex, srcWord.length()));
srcWord = numReplaced.toString();
//6. 创建一个存储最终结果的StringBuilder对象
StringBuilder target = new StringBuilder();
//7. 以空格为分割,切割替换空格和数字之后的字符串
String[] srcs = srcWord.split(" ");
//8. 将每个单词转换为字符数组,然后把第一个字符搞成大写
for (String src : srcs) {
char[] chs = src.toCharArray();
char ch = chs[0];
if (ch >= 97 && ch <= 122) {
chs[0] -= 32;
}
target.append(chs);
target.append(" ");
}
System.out.println(target.toString());
}
}