yaqiukasi
yaqiukasi
采纳率91.7%
2017-02-21 06:27 阅读 1.4k
已采纳

问一个蓝桥杯的java题,新手求解

题目要求是:
1. 把每个单词的首字母变为大写。
2. 把数字与字母之间用下划线字符(_)分开,使得更清晰
3. 把单词中间有多个空格的调整为1个空格。
我们假设:用户输入的串中只有小写字母,空格和数字,不含其它的字母或符号。每个单词间由1个或多个空格分隔。假设用户输入的串长度不超过200个字符。

程序是这样的:
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SimpleString {
public static void main(String args[]){
String str="";//空字符串,并且在内存中开辟了空间
str=(new Scanner(System.in)).nextLine();//获取行
String []str1=str.split("[ ]+");
for(int i=0;i<str1.length;i++)str1[i]=String.valueOf((char)(str1[i].charAt(0)+('A'-'a')))+str1[i].substring(1);
String s="";
for(int i=0;i<str1.length-1;i++)//System.out.print(str1[i]+" ");
{
s+=str1[i]+" ";//一个字符串加一个空格
}
s+=str1[str1.length-1];//加上最后一个字符串
Pattern p=Pattern.compile("([0-9]+)");//正则表达式,判断数字
Matcher m=p.matcher(s);//测试字符串s
String fin="";
int st=0;
while(m.find()){//部分匹配
int start=m.start();
int end=m.end();
fin+=s.substring(st,start);//截取0到start-1
if(s.charAt(start-1)!=' ')fin+="_";//数字的前面如果不是空格,加下划线
fin+=m.group(1);
if(s.charAt(end)!=' ')fin+="_";//数字的末尾如果不是空格,加下划线
st=end;//数字结尾的下一个字符的位置
}
if(st<s.length())fin+=s.substring(st);//最后一串数字的结尾如果不是字符串尾部,则加上剩下的字符
System.out.println(fin);
}
}
有些地方能看懂,我加了注释,其他地方还有些问题:
1、String []str1=str.split("[ ]+");是什么意思?是按空格来分开字符串吗?如果字符之间有两个以上的空格程序是怎么处理的?
2、for(int i=0;i<str1.length;i++)str1[i]=String.valueOf((char)(str1[i].charAt(0)+('A'-'a')))+str1[i].substring(1);这段代码什么意思?
3、fin+=m.group(1);是什么意思?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

1条回答 默认 最新

  • 已采纳
    u011339641 我是一堆小石头 2017-02-21 06:49

    大概看了一下,都是一些正则表达式的基本语法,比如你提出来的第一个问题, String []str1=str.split("[ ]+") 里的"[ ]+"是一个正则表达式,表示的意思是匹配一个或者多个空格符。
    再看第三个问题,也是正则的语法,返回的结果是上述代码中的变量:s,通过正则表达式"([0-9]+)"所匹配出来的“第一个”结果。该表达式是匹配一个或多个数字。至于为什么要用m.group(1)才能得出结果,我就不解释了,具体可看正则表达式中group的语法。
    至于第二个问题,无外乎是java关于字符串的一些操作,像substring,charAt之类的,都是基础语法问题。

    点赞 1 评论 复制链接分享

相关推荐