黑马程序员技术交流社区

标题: 关于字符串处理的问题 [打印本页]

作者: 王晓东    时间: 2012-6-3 09:11
标题: 关于字符串处理的问题
要求:用户输入一串单词(不超过50个字符),如
we are at the b2b web  
编程实现:
每个单词首字母大写
多个空格只输出一个
数字与字符之间要用“_”间隔
即输出:
We Are At The B_2_b Web 大家帮忙看一下呗!
作者: 张少威    时间: 2012-6-3 09:18
  1. 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对象中 * * */ 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()); } }
复制代码

作者: 张少威    时间: 2012-6-3 09:22
代码贴上去咋成这样儿啦
作者: 张少威    时间: 2012-6-3 09:29
  1. import java.util.Scanner;
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;

  4. /**
  5. * 要求:用户输入一串单词(不超过50个字符),
  6. * 如 we are at the b2b web 编程实现:
  7. *         每个单词首字母大写
  8. *         多个空格只输出一个
  9. *         数字与字符之间要用“_”间隔
  10. * 即输出: We Are At The B_2_b Web 大家帮忙看一下呗!
  11. *
  12. * 思路:
  13. *         1. 替换空格
  14. *         2. 构建一个StringBuilder,用于存储从原字符串中截取的子字符串
  15. *         3. 创建一个匹配数字的Matcher
  16. *         4. 每匹配到一次执行以下四步
  17. *             4.1. 截取上一次匹配处到这次匹配处之间的字符串,append到StringBuilder对象中
  18. *             4.2. 如果匹配到的数字前面有没有空格,则将一个"_"append到StringBuilder对象中
  19. *             4.3. 将匹配到的数字append到StringBuilder对象中
  20. *             4.4. 如果匹配到的数字后面有没有空格,则将一个"_"append到StringBuilder对象中
  21. *         5. 将剩下的字符串截取出来append到StringBuilder对象中
  22. *         6. 创建一个存储最终结果的StringBuilder对象
  23. *         7. 以空格为分割,切割替换空格和数字之后的字符串
  24. *         8. 将每一个切割出来的子字符串转换为字符数组,判断第一个字符是否为小写字母,如果是,
  25. *             则转换为大写字母,然后将该字符数组存储到存储最终结果的StringBuilder对象中
  26. *
  27. */
  28. public class WordDemo {
  29.     public static void main(String[] args) {
  30.         Scanner sc = new Scanner(System.in);
  31.         String srcWord = sc.nextLine();
  32.         sc.close();
  33.         
  34.         //1. 替换空格
  35.         srcWord = srcWord.replaceAll(" {2,}", " ");
  36.         
  37.         //2. 构建一个StringBuilder,用于存储从原字符串中截取的子字符串
  38.         StringBuilder numReplaced = new StringBuilder();
  39.         
  40.         //3. 创建一个匹配数字的Matcher
  41.         Pattern p = Pattern.compile("\\d+");
  42.         Matcher m = p.matcher(srcWord);
  43.         
  44.         //4. 替换数字
  45.         int startIndex = 0;
  46.         int matchedStartIndex = 0, matchedEndIndex = 0;
  47.         while (m.find()) {
  48.             matchedStartIndex = m.start();
  49.             matchedEndIndex = m.end();
  50.             //4.1. 截取上一次匹配处到这次匹配处之间的字符串,append到StringBuilder对象中
  51.             numReplaced.append(srcWord.substring(startIndex, matchedStartIndex));
  52.             //4.2. 如果匹配到的数字前面有没有空格,则将一个"_"append到StringBuilder对象中
  53.             if (matchedStartIndex > 0 && srcWord.charAt(matchedStartIndex-1) != ' ') {
  54.                 numReplaced.append("_");
  55.             }
  56.             //4.3. 将匹配到的数字append到StringBuilder对象中
  57.             numReplaced.append(m.group());
  58.             //4.4. 如果匹配到的数字后面有没有空格,则将一个"_"append到StringBuilder对象中
  59.             if (matchedEndIndex < srcWord.length() && srcWord.charAt(matchedEndIndex) != ' ') {
  60.                 numReplaced.append("_");
  61.             }
  62.             startIndex = matchedEndIndex;
  63.         }
  64.         
  65.         //5. 将剩下的字符串截取出来append到StringBuilder对象中
  66.         numReplaced.append(srcWord.substring(matchedEndIndex, srcWord.length()));
  67.         
  68.         srcWord = numReplaced.toString();
  69.         
  70.         //6. 创建一个存储最终结果的StringBuilder对象
  71.         StringBuilder target = new StringBuilder();
  72.         
  73.         //7. 以空格为分割,切割替换空格和数字之后的字符串
  74.         String[] srcs = srcWord.split(" ");
  75.         
  76.         //8. 将每个单词转换为字符数组,然后把第一个字符搞成大写
  77.         for (String src : srcs) {
  78.             char[] chs = src.toCharArray();
  79.             char ch = chs[0];
  80.             if (ch >= 97 && ch <= 122) {
  81.                 chs[0] -= 32;
  82.             }
  83.             target.append(chs);
  84.             target.append(" ");
  85.         }
  86.         
  87.         System.out.println(target.toString());
  88.     }
  89. }
复制代码

作者: 张亭    时间: 2012-6-3 11:42
咱也写一个练练手,供参考:
  1. public static String changString(String s){
  2.     if (s==null)
  3.          return s;
  4.     s=s.trim();
  5.     StringBuilder sb = new StringBuilder();
  6.     //以空格分隔为字符串数组
  7.     String[] strs = s.split(" +");
  8.     for(String str : strs){
  9.         //如果首字母小写,则改为大写
  10.         if(str.matches("[a-z].*")){
  11.            char ch = str.charAt(0);
  12.            str = str.replaceFirst("[a-z]", String.valueOf(ch).toUpperCase());
  13.         }
  14.        //在每段数字前后都加上"_"
  15.        str = str.replaceAll("(\\d+)", "_$1_");
  16.      //去掉首尾的"_"(如果以数字开头或结尾的话)
  17.       str = str.replaceAll("^_", "").replaceAll("_$", "");
  18.       sb.append(str+' ');
  19.   }
  20. //去掉最后的空格
  21.     sb.deleteCharAt(sb.length()-1);
  22.     return sb.toString();
  23. }
复制代码
楼主自己多写写吧,只看别人的话没多大用

作者: 杜俊彪    时间: 2012-6-3 11:45
我也觉得,  你先写写,  我们再参考参考;   共勉!
作者: 黑马—陈磊    时间: 2012-6-3 12:00
贴出我自己写的代码(没写注释楼主可以参考参考很简单的):
/**
         * @param args
         */
        public static void main(String[] args) {

                String s ="we are  at the b2b web";

                String pp = "";
                ArrayList al = new ArrayList();
                String t = "";       
                s = s.replace(" ", "*") + "*";
                for (int i = 1; i < s.length(); i++) {
                        char im = s.substring(i - 1, i).charAt(0);
                        char in = s.substring(i, i + 1).charAt(0);
                        if ((in <= '9' && in >= '0' && im >= 'a' && im <= 'z')
                                        || (im <= '9' && im >= '0' && (in >= 'a' && in <= 'z'))) {
                                pp += s.substring(i - 1, i) + "_";

                        } else {
                                pp += s.substring(i - 1, i);
                        }
                }
                pp = pp + "*";
                for (int i = 0; i < pp.length(); i++) {
                        if (pp.substring(i, i + 1).equals("*")) {
                                al.add(t);
                                t = "";
                                continue;
                        } else {
                                t += pp.substring(i, i + 1);
                        }
                }
                for (int i = 0; i < al.size(); i++) {
                        if (al.get(i) != "")
                                System.out.print(al.get(i).toString().substring(0, 1)
                                                .toUpperCase()
                                                + al.get(i).toString().substring(1) + " ");
                }
        }
作者: 黑马11期李项京    时间: 2012-6-3 13:15
张亭 发表于 2012-6-3 11:42
咱也写一个练练手,供参考:楼主自己多写写吧,只看别人的话没多大用

正则表达式运用的这么成熟,很牛喔
作者: 黑马11期李项京    时间: 2012-6-3 13:15
张亭 发表于 2012-6-3 11:42
咱也写一个练练手,供参考:楼主自己多写写吧,只看别人的话没多大用

正则表达式运用的这么成熟,很牛喔




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2