关于字符串处理的若干问题!! 要求:用户输入一串单词(不超过50个字符),如we are at the b2b web 编程实现:每个单词首字母大写多个空格只输出一个数字与字符之间要用“_”间隔即输出:We Are At The B_2_b Web 大家帮忙看一下呗! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果用Java实现,可以先用string的split方法得到每个单词,然后对每个单词进行相应的处理。如果是C/C++,可以通过指针实现。设置两个指针p1、p2,二者交替向前处理。如p1指向字符串起始处的w时,p2向前移动,遇到空格停止然后移动指针p1,同时进行相应处理如此这般 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()); }} 示例代码: String str = "we are at the b2b web"; char last = 0; StringBuilder buff = new StringBuilder(); for(char ch : str.toCharArray()){ switch (last) { case 0: buff.append(Character.toUpperCase(ch)); break; case ' ': case '\t': if(ch==' ' || ch=='\t'){ continue; }else{ buff.append(Character.toUpperCase(ch)); } break; default: if(last>='0' && last<='9'){ buff.append('_').append(ch); }else if(ch>='0' && ch<='9'){ buff.append('_').append(ch); }else{ buff.append(ch); } break; } last = ch; } System.out.println(buff); package com.walkman.exercise.one;/** * 要求:用户输入一串单词(不超过50个字符),如we are at the b2b web 编程实现: * 每个单词首字母大写,多个空格只输出一个,数字与字符之间要用“_”间隔 即输出: We Are At The B_2_b Web * */public class ChangeFormatOfWord { public static void main(String[] args) { String str = "ab Cd ef"; new ChangeFormatOfWord().change(str); } public void change(String str) { // 判断字符串不能为空,否则直接退出 if ("".equals(str)) { System.out.println("您输入的是空字符串"); return; } // 改写上面的程序 while (true) { int loc = str.indexOf(" "); char initialLetter = str.charAt(0); if (loc == -1) { // 截取到没有空格或者字符串一个空格也没有 if (initialLetter >= 'a' && initialLetter <= 'z') { str = str.replace(initialLetter, (char) (initialLetter - 32)); // 如果为小写则转换 System.out.println(str); } else { System.out.println(str); } break; } else { if (initialLetter >= 'a' && initialLetter <= 'z') { System.out.println(str.substring(0, loc).replace( initialLetter, (char) (initialLetter - 32))); // 如果为小写则转换 } else { System.out.println(str.substring(0, loc)); } str = str.substring(str.indexOf(" ") + 1).trim(); // 去除掉空格 } } }} import java.util.regex.Matcher;import java.util.regex.Pattern;public class test { public static void main(String[] args) { String content = "we are at the b2b web"; String[] str = content.split(" "); StringBuilder sb = new StringBuilder(""); for (int i = 0, len = str.length; i < len; i++) { if (i != 0) { sb.append(" ").append(worldPrase(str[i])); } else { sb.append(worldPrase(str[i])); } } System.out.println(sb.toString()); } public static String worldPrase(String content) { String pattern = "([a-z])(.*)"; Matcher matcher = Pattern.compile(pattern).matcher(content); if (matcher.matches()) { char head = (char) (content.charAt(0) - 32); content = head + matcher.group(2); } pattern = "\\d+|[a-zA-Z]+";// 仅是数字或字母的情况,不需要加"_"的逻辑 StringBuilder sb = new StringBuilder(""); matcher = Pattern.compile(pattern).matcher(content); if (!matcher.matches()) { String temp = content + "_";// 分析结束标志 while (!temp.equals("_")) { pattern = "(\\d+)(.*)|([a-zA-Z]*)(.*)"; matcher = Pattern.compile(pattern).matcher(temp); if (matcher.matches()) { int i = 1; if (matcher.group(1) == null) { i = 3; } if (temp.equals(content + "_")) { sb.append(matcher.group(i)); } else { sb.append("_").append(matcher.group(i)); } temp = matcher.group(i + 1); } } } String result = sb.toString(); if (result.length() < content.length()) { result = content; } return result; }} 谢谢各位:下面是我写的代码用正则表达式,测试能行 供参考(没有考虑以数字开头或其他特殊字符情况):public class Test { public static void main(String[]args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException, Exception{ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out)); StringBuilder sbuider=new StringBuilder(); String line=null; String line2=null; while((line=br.readLine())!=null){ Pattern p2=Pattern.compile("([a-zA-Z])+(\\d+)([a-zA-Z])+");//正则表达式匹配前面是字符中间是数字后面是字母 Matcher m2=p2.matcher(line); //把有数字的地方替换成_字母_的形式 while(m2.find()){ line2=line.replaceAll(m2.group(2), "_"+m2.group(2)+"_");//将数值前后加上下划线,这里用到分组 } Pattern p1=Pattern.compile("\\s+"); //按空白符号把字符串分为数组 String[]arr=p1.split(line2); for(String s:arr){ s=s.substring(0,1).toUpperCase()+s.substring(1,s.length()); sbuider.append(s); sbuider.append(" ");//添加一个空白符号 } line2=sbuider.toString(); bw.write(line2); bw.flush(); }望大家指点!!!! 我那代码是临时写的,没检查好,方法名没敲好,当时手瘸了更正一下方法名,应该是“wordParser”,不是“worldPrase”,我有罪。 java基础知识再仔细看看吧、这问题该留给自己敲出来才有意义、 hibernate使用oracle序列 String 那位兄弟知道那个国际开源的java tank 项目的网站地址 eclipse 3.3 & lomboz 请教List<Emp> emps=new ArrayList<Emp>();的语法是怎么回事? 我们老师让我用java存储xml ,存储到postgreSQL中 如何在MDI的子窗口得到父窗口的实例? [非灌水]哪位兄弟知道如何制作背景透明gif? JTable太长超出边框暴难看,求救!(附上代码) 在JAVA中的批处理文件怎么写? 装了JAD之后,Eclipse的配置问题 关于泛型的一个小问题
可以先用string的split方法得到每个单词,
然后对每个单词进行相应的处理。如果是C/C++,可以通过指针实现。
设置两个指针p1、p2,二者交替向前处理。
如p1指向字符串起始处的w时,p2向前移动,遇到空格停止
然后移动指针p1,同时进行相应处理
如此这般
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.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());
}
}
char last = 0;
StringBuilder buff = new StringBuilder();
for(char ch : str.toCharArray()){
switch (last) {
case 0:
buff.append(Character.toUpperCase(ch));
break;
case ' ':
case '\t':
if(ch==' ' || ch=='\t'){
continue;
}else{
buff.append(Character.toUpperCase(ch));
}
break;
default:
if(last>='0' && last<='9'){
buff.append('_').append(ch);
}else if(ch>='0' && ch<='9'){
buff.append('_').append(ch);
}else{
buff.append(ch);
}
break;
}
last = ch;
}
System.out.println(buff);
package com.walkman.exercise.one;/**
* 要求:用户输入一串单词(不超过50个字符),如we are at the b2b web 编程实现:
* 每个单词首字母大写,多个空格只输出一个,数字与字符之间要用“_”间隔 即输出: We Are At The B_2_b Web
*
*/
public class ChangeFormatOfWord {
public static void main(String[] args) {
String str = "ab Cd ef";
new ChangeFormatOfWord().change(str);
} public void change(String str) {
// 判断字符串不能为空,否则直接退出
if ("".equals(str)) {
System.out.println("您输入的是空字符串");
return;
} // 改写上面的程序
while (true) {
int loc = str.indexOf(" ");
char initialLetter = str.charAt(0);
if (loc == -1) { // 截取到没有空格或者字符串一个空格也没有
if (initialLetter >= 'a' && initialLetter <= 'z') {
str = str.replace(initialLetter,
(char) (initialLetter - 32)); // 如果为小写则转换
System.out.println(str);
} else {
System.out.println(str);
}
break;
} else {
if (initialLetter >= 'a' && initialLetter <= 'z') {
System.out.println(str.substring(0, loc).replace(
initialLetter, (char) (initialLetter - 32))); // 如果为小写则转换
} else {
System.out.println(str.substring(0, loc));
}
str = str.substring(str.indexOf(" ") + 1).trim(); // 去除掉空格
}
} }
}
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class test {
public static void main(String[] args) {
String content = "we are at the b2b web";
String[] str = content.split(" ");
StringBuilder sb = new StringBuilder("");
for (int i = 0, len = str.length; i < len; i++) {
if (i != 0) {
sb.append(" ").append(worldPrase(str[i]));
} else {
sb.append(worldPrase(str[i]));
}
}
System.out.println(sb.toString());
} public static String worldPrase(String content) {
String pattern = "([a-z])(.*)";
Matcher matcher = Pattern.compile(pattern).matcher(content);
if (matcher.matches()) {
char head = (char) (content.charAt(0) - 32);
content = head + matcher.group(2);
}
pattern = "\\d+|[a-zA-Z]+";// 仅是数字或字母的情况,不需要加"_"的逻辑
StringBuilder sb = new StringBuilder("");
matcher = Pattern.compile(pattern).matcher(content);
if (!matcher.matches()) {
String temp = content + "_";// 分析结束标志
while (!temp.equals("_")) {
pattern = "(\\d+)(.*)|([a-zA-Z]*)(.*)";
matcher = Pattern.compile(pattern).matcher(temp);
if (matcher.matches()) {
int i = 1;
if (matcher.group(1) == null) {
i = 3;
}
if (temp.equals(content + "_")) {
sb.append(matcher.group(i));
} else {
sb.append("_").append(matcher.group(i));
}
temp = matcher.group(i + 1);
}
}
}
String result = sb.toString();
if (result.length() < content.length()) {
result = content;
}
return result;
}
}
况):public class Test { public static void main(String[]args) throws ClassNotFoundException,
SecurityException, NoSuchMethodException, IllegalArgumentException,
InstantiationException, IllegalAccessException, InvocationTargetException,
NoSuchFieldException, Exception{ BufferedReader br=new BufferedReader(new InputStreamReader
(System.in)); BufferedWriter bw=new BufferedWriter(new OutputStreamWriter
(System.out)); StringBuilder sbuider=new StringBuilder(); String line=null; String line2=null; while((line=br.readLine())!=null){ Pattern p2=Pattern.compile("([a-zA-Z])+(\\d+)([a-zA-
Z])+");//正则表达式匹配前面是字符中间是数字后面是字母 Matcher m2=p2.matcher(line); //把有数字的地方替换成_字母_的形式 while(m2.find()){ line2=line.replaceAll(m2.group(2), "_"+m2.group
(2)+"_");//将数值前后加上下划线,这里用到分组 } Pattern p1=Pattern.compile("\\s+"); //按空白符号把字符串分为数组 String[]arr=p1.split(line2); for(String s:arr){ s=s.substring(0,1).toUpperCase()+s.substring(1,s.length()); sbuider.append(s); sbuider.append(" ");//添加一个空白符号 } line2=sbuider.toString(); bw.write(line2); bw.flush(); }望大家指点!!!!
更正一下方法名,应该是“wordParser”,不是“worldPrase”,我有罪。