如题!我不希望用for循环来一个一个的遍历哈!
最好是直接用一句正则表达式给实现
最好是直接用一句正则表达式给实现
解决方案 »
- 锁的同步小问题
- Cacheable接口是干嘛用的?
- 寻找我的挚爱!!!
- 高手帮忙看看,是哪里的问题 ?
- 关于java程序运行的怪问题(jdk),望大虾快快指点
- JAVA程序怎么可以脱离开JVM执行呀?
- JPanel,如何能使它有右侧的和底部的滚轴?
- jtable中有一列中的各cell是用一自定义的Renderer表现,此renderder表现为一link,如何当鼠标移动到此renderder上时,出现手状图形?实质
- 为什么随机数不能生成呢?我执行完,一片空白!
- 编译完成的.class怎么才能运行呀?
- 请教一下大家java里面有没有测试某段程序的执行时间的方法
- 谁知道哪里有scjp310-055题库的讲解啊
public static void main(String[] args) {
String str="user_name_length";
String regex="_";
str=str.replaceAll(regex, "");
System.out.println(str); }}
测试结果:usernamelength
写这种过滤字符的,一般都用这个
StringBuffer s = new StringBuffer();
Matcher m = Pattern.compile("(?i)\\_([a-z])").matcher(str);
while (m.find())
m.appendReplacement(s, m.group(1).toUpperCase());
str = m.appendTail(s).toString();
/**
* @param args
*/
public static void main(String[] args) { String str = "user_name_length";
String[] temp = str.split("_");
StringBuffer tmp = new StringBuffer(); for (int i = 0; i < temp.length; i++) { if (i == 0) {
tmp.append(temp[i]); }
{
tmp.append(firstLetterUpperCaset(temp[i])); }
} System.out.println(tmp); } public static String firstLetterUpperCaset(String str) {
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length; i++) {
if (i == 0) {
ch[i] = (char) (ch[i] - 32);
}
}
return new String(ch);
}
* @(#)Regex.java 2008-3-25 上午01:12:55
*/
package cn.ialvin.util;import java.util.Iterator;
import java.util.Properties;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/**
* 正则表达式常用包装类
* @author 林志斌(<b>ialvin.cn</b>) 广东 普宁 里湖
*/
public class Regex {
Pattern p;
private String reg = "";
private boolean GLOBAL = false;
private int mode = 0; /**
* 构造一个 Regex 对象
* @param reg 正则表达式
* @param md 表达式的匹配模式
*/
public Regex(String reg, String md) {
if (reg != null)
this.reg = reg;
else
this.reg = "";
this.setMode(md);
} /**
* 构造一个 Regex 对象
* @param reg 正则表达式
*/
public Regex(String reg) { this(reg, null); } /**
* 设置正则表达式的匹配模式
* @param md 匹配模式
*/
private void setMode(String md) {
if (md == null) md = "";
md = md.toLowerCase();
if (md.indexOf("i") != -1) {
this.mode = (this.mode | Pattern.CASE_INSENSITIVE);
}
if (md.indexOf("g") != -1) {
this.GLOBAL = true;
}
if (md.indexOf("m") != -1) {
this.mode = this.mode | Pattern.MULTILINE;
}
if (md.indexOf("s") != -1) {
this.mode = this.mode | Pattern.DOTALL;
}
if (md.indexOf("c") != -1) {
this.mode = this.mode | Pattern.COMMENTS;
}
p = Pattern.compile(this.reg, this.mode);
} /**
* 测试本正则表达式能否匹配 src 字符串
* @param src 要测试的字符串对象
* @return boolean value
*/
public boolean test(String src) {
return p.matcher(src).find();
} /**
* 测试源字串能否被正则完全匹配
* @param src 源字串
* @return 匹配结果
*/
public boolean match(String src) {
return p.matcher(src).matches();
} /**
* 使用本对象对 src 进行匹配替换为 to. 如:
* <b><pre>
* Regex regex = new Regex("\\d+", "ig");
* String src = "abcde138ddef256asdf";
* String res = regex.replace(src, "[Number]");
* 结果: (true == res.equals("abcde[Number]ddef[Number]asdf"))
* </pre></b>
* @param src 源字符串内容
* @param to 将匹配到字符串段替换的内容
* @return String Object
*/
public String replace(String src, String to) {
if (src == null) return null;
if (to == null) to = "";
Matcher m = p.matcher(src);
if (this.GLOBAL)
return m.replaceAll(to);
return m.replaceFirst(to);
} /**
* 相当于: <b>String result = (new Regex(reg, mode)).replace(src, to);</b>
* @param reg 正则表达式
* @param src 源字符串内容
* @param to 将匹配到字符串段替换的内容
* @param mode 正则表达式匹配模式
* @return String Object
*/
public static String replace(String reg, String src, String to, String mode) {
if (src == null) return null;
if (reg == null) return src;
if (to == null) to = "";
Regex regex = new Regex(reg);
if (mode != null) regex.setMode(mode);
return regex.replace(src, to);
} /**
* 相当于 Regex.replace(reg, src, to, "g");
* @param reg 正则表达式
* @param src 源字符串内容
* @param to 将匹配到字符串段替换的内容
* @return String Object
*/
public static String replace(String reg, String src, String to) {
return Regex.replace(reg, src, to, "g");
} /**
* 例子: <b><pre>
* String src = "xxxxxxx5Add6xxxx721add3xxxx";
* Regex reg = new Regex("(\\d+)add(\\d+)", "ig");
* String result = reg.replace(src, new Replacement() {
* public String getReplacement(Matcher m) {
* int i = Integer.parseInt(m.group(1)) + Integer.parseInt(m.group(2));
* return String.valueOf(i);
* }
* });
* result.equals("xxxxxxx11xxxx724xxxx")
* </pre></b>
* @param src 源字串
* @param mp 取代内容处理器
* @return 替换结果
*/
public String replace(String src, Replacement mp) {
StringBuffer sb = new StringBuffer();
Matcher m = this.p.matcher(src);
if (m.find()) {
m.appendReplacement(sb, Matcher.quoteReplacement(mp.getReplacement(m)));
}
if (this.GLOBAL) {
while(m.find()) {
m.appendReplacement(sb, Matcher.quoteReplacement(mp.doProcess(m)));
}
}
return m.appendTail(sb).toString();
}
}
package cn.ialvin.util;import java.util.regex.Matcher;public interface Replacement {
public String getReplacement(Matcher m);
}
上面是自己粗糙的包装有了之后,同样问题就可以简洁点处理
str = new Regex("\\_(.)", "ig").replace(str, new Replacement() {
public String getReplacement(Matcher m) {
return m.group(1).toUpperCase();
}
});
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexTest {
public static void main(String[] args) {
String str="user_name_length";
String regex="_\\w";
String s=null;
Matcher m=Pattern.compile(regex).matcher(str);
while(m.find()){
s=m.group();
str=str.replace(s,(s.charAt(1)+"").toUpperCase());
}
System.out.println(str); }}
测试结果:userNameLength
package com.bluefish.hr.wage.input.bean;import java.util.HashSet;
import java.util.Set;public class Test {
private final static Set<String> replacestrings = new HashSet<String>();
static {
for (int i = 65; i < 91; i++) {
replacestrings.add("_" + (char) i);
}
} public static void main(String[] args) {
System.out.println(changeUseArray("user_name_length"));
System.out.println(changeUseSet("_user__name_length"));
} /** 如果说出现类似 user__name_length或者_user_name_length的字符串会出现问题 不过可以换另一种方法解析成数组 */
public final static String changeUseArray(String string) {
if (string == null || string.trim().equals("")
|| string.indexOf("_") == -1) {
return string;
} else {
String[] strings = string.trim().split("_");
for (int i = 1; i < strings.length; i++) {
String str = strings[i];
str = str.substring(0, 1).toUpperCase() + str.substring(1);
strings[i] = str;
}
StringBuffer stringbuffer = new StringBuffer(strings[0]);
for (int i = 1; i < strings.length; i++) {
stringbuffer.append(strings[i]);
}
return stringbuffer.toString();
}
} /** 还有一种就是写死的 这个比较容易 而且也能避免那些错误 而且最多替换26次(最糟糕的是必须得比较26次...) */
public final static String changeUseSet(String string) {
if (string == null || string.trim().equals("")
|| string.indexOf("_") == -1) {
return string;
} else {
if (string.indexOf("_") == 0) {
string = string.replaceFirst("_", "");
}
for (String repalceString : replacestrings) {
string = string.replace(repalceString.toLowerCase(),
repalceString.toUpperCase());
}
string = string.replace("_", "");
return string;
}
}
}如果说是过滤的字符串数量多的话我建议用第一个(前提是过滤的字符串比较短)
如果说是过滤单个字符串比较长 那必须用第二个
虽然没用正则 但小弟尽力了
然后从第2个开始,把第一个字母变成大写
最后一拼(过滤掉空的数组)
完事儿good luck
方法在上头我写了 但是有个坏处 至少分析成数组的时候不要用split 如果用了的话 出现与火龙果所说的一样的字符串的时候 就会出异常