A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄方 中级黑马   /  2012-2-26 09:17  /  4048 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

要求从键盘输入多个字符,如:输入we  are  at      the   b2b  web    要求编程实现:
每个单词首字母大写
多个空格只输出一个
数字与字符之间要用“_”间隔
即输出:
We Are At The B_2_b Web  希望大家帮忙看下吧!谢啦!

5 个回复

倒序浏览
本帖最后由 H07000223 于 2012-2-26 14:53 编辑

如果只是完成你提的条件的话只用红色标注的判断就足够了。主要是为了把可能的情况补全,

不然这种特定的情况程序下的什么意义!真是花了我好长时间,主要也是我这部分没学好的原因。

我分别用下面的几种情况试了下,你试试吧~~~亲
we  are  at      the   b2b  web
we  are  at      the   2b  web
we  are  at      the   22b  web
we  are  at      the   b22  web[code]public class Test_012
{
        public static void main(String args[]) {
                Scanner scan = new Scanner(System.in);// 从键盘接收数据
                System.out.print("输入数据:");
//                scan.useDelimiter("\b");// 修改定界符
               
                while(scan.hasNext())
                {
                        String str=scan.next();
                       
                        String firstLetter=str.substring(0,1).toUpperCase();//首字母大写
                       
                        String str2=firstLetter+str.substring(1);
                       
                        for(int i=0;i<str.length();i++)
                        {
                                if(str2.charAt(i)<57&&str2.charAt(i)>48)
                                {
                                       
                                        if(0==i&&(str2.charAt(i+1)>57||str2.charAt(i+1)<48))
                                        {
                                                str2=str2.substring(0,i+1)+"_"+str2.substring(i+1);
                                        }
                               
                                        //两边都是字母
                                        if(i!=0&&(str2.charAt(i-1)>57||str2.charAt(i-1)<48)&&(str2.charAt(i+1)>57||str2.charAt(i+1)<48))
                                        {
                                               
                                                str2=str2.substring(0,i)+"_"+
                                                         str2.charAt(i)+"_"+str2.substring(i+1);
                                                break;
                                        }
                                       
                                        //右边是数字,左边是字母
                                        if(i!=0&&(str2.charAt(i+1)<57&&str2.charAt(i+1)>48)&&(str2.charAt(i-1)>57||str2.charAt(i-1)<48))
                                        {
                                                str2=str2.substring(0,i)+"_"+str2.substring(i);
                                                break;
                                        }
                                       
                                        //左边是数字,右边是字母
                                        if(i!=0&&(str2.charAt(i-1)<57&&str2.charAt(i-1)>48)&&(str2.charAt(i+1)>57||str2.charAt(i+1)<48))
                                        {
                                                str2=str2.substring(0,i+1)+"_"+str2.substring(i+1);
                                                break;
                                        }
                                }
                        }
                       
                        System.out.print(str2+" ");
                }
               
        }
}
回复 使用道具 举报
本帖最后由 马胜平 于 2012-2-26 14:47 编辑

下面是我写的代码用正则表达式,测试能行 供参考(没有考虑以数字开头或其他特殊字符情况):
  1. public class Test {
  2.         public static void main(String[]args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException, Exception{

  3.                 BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
  4.                 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
  5.                 StringBuilder sbuider=new StringBuilder();
  6.                 String line=null;
  7.                 String line2=null;
  8.                
  9.                 while((line=br.readLine())!=null){
  10.                
  11.                         Pattern p2=Pattern.compile("([a-zA-Z])+(\\d+)([a-zA-Z])+");//正则表达式匹配前面是字符中间是数字后面是字母
  12.                         Matcher m2=p2.matcher(line);
  13.                         //把有数字的地方替换成_字母_的形式
  14.                         while(m2.find()){
  15.                                 line2=line.replaceAll(m2.group(2), "_"+m2.group(2)+"_");//将数值前后加上下划线,这里用到分组
  16.                         }

  17.                         Pattern p1=Pattern.compile("\\s+");
  18.                    //按空白符号把字符串分为数组
  19.             String[]arr=p1.split(line2);
  20.             for(String s:arr){
  21.                     s=s.substring(0,1).toUpperCase()+s.substring(1,s.length());
  22.                     sbuider.append(s);
  23.                     sbuider.append(" ");//添加一个空白符号
  24.             
  25.             }
  26.             line2=sbuider.toString();

  27.                         bw.write(line2);
  28.                        
  29.                                 bw.flush();
  30.                        
  31.                 }
  32.                
  33.        
  34.                
  35.                

  36.                
  37.                
  38.         }



  39. }
复制代码
回复 使用道具 举报
没写录入:
  1. public static void main(String[] args) throws Exception
  2.         {
  3.                 String s="we  are  at      the   b2b  web ";
  4.                 s=s.replaceAll(" +"," ");
  5.                 s=s.replaceAll("(\\w+)(\\d+)","$1_$2");
  6.                 // s=s.replaceAll("\\b(\\w)|\\s(\\w)",String.toUpperCase(" $1"));
  7.                 StringBuffer sb=new StringBuffer();
  8.                 Pattern p=Pattern.compile("\\b(\\w)|\\s(\\w)");
  9.                 Matcher m=p.matcher(s);
  10.                 while(m.find()){
  11.                         m.appendReplacement(sb,m.group().toUpperCase());
  12.                 }
  13.                 m.appendTail(sb);
  14.                 System.out.println(sb);
  15.    }
复制代码
回复 使用道具 举报
本帖最后由 舞动的心弦 于 2012-2-26 19:32 编辑

我花了一下午终于写出来了,可能没大家的简单,希望大家能够提提意见啦!
  1. 2.import java.util.Scanner;
  2. import java.util.regex.Matcher;
  3. import java.util.regex.Pattern;

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

之前我的程序不够全面,现改写了(录入仍未写,楼上有不少例子):
  1. import java.util.regex.Pattern;
  2. import java.util.regex.Matcher;
  3. public class Test {
  4.         public static void main(String[] args) throws Exception
  5.         {
  6.                 String s="we  are  at      the   b2b  web 2aT22f5p 2m2";
  7.                 s=s.replaceAll(" +"," ");    //多个空格只输出一个
  8.                 s=s.replaceAll("([A-Za-z])(\\d)","$1_$2"); //左字符+右数字用"_"间隔
  9.                 s=s.replaceAll("(\\d)([A-Za-z])","$1_$2");  //左数字+右字符用"_"间隔
  10.                 StringBuffer sb=new StringBuffer();
  11.                 Pattern p=Pattern.compile("\\b\\w|\\s\\w"); //首字母大写
  12.                 Matcher m=p.matcher(s);
  13.                 while(m.find()){
  14.                         m.appendReplacement(sb,m.group().toUpperCase());
  15.                 }
  16.                 m.appendTail(sb);
  17.                 System.out.println(sb);
  18.    }
  19. }
复制代码
输出:We Are At The B_2_b Web 2_aT_22_f_5_p 2_m_2
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马