日期:2014-05-20  浏览次数:20810 次

关于字符串处理的若干问题!!
要求:用户输入一串单词(不超过50个字符),如
we are at the b2b web  
编程实现:
每个单词首字母大写
多个空格只输出一个
数字与字符之间要用“_”间隔
即输出:
We Are At The B_2_b Web 大家帮忙看一下呗!

------解决方案--------------------
Java code

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();
    }
    
}

------解决方案--------------------
Java code
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());
    }
}