字符串中找数字,怎么实现? 字符串abc123de45f67,把里面所有的数字字串找出来,并且存贮起来,例如你要把123,4,67找出来,放到3个char型数组里。怎么做? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这是一个尤其适合的正则表达式场景。 Pattern p = Pattern.compile("[\\d]+"); Matcher m = p.matcher(abc123de45f67); //m.matches(); 使用asc码判断数字,从字符串头开始查找,把找到的数据,放到临时变量中。 public static void main(String[] args)throws Exception { String str = "abc123de45f67"; List<char[]> list = new ArrayList<char[]>(); StringBuffer sb = new StringBuffer(); boolean find = false; for(int i=0,j=str.length();i<j;i++){ char ch = str.charAt(i); if(ch >= '0' && ch <= '9'){ find = true; }else{ find = false; if(sb.length() > 0){ list.add(sb.toString().toCharArray()); sb.delete(0, sb.length()); } } if(find){ sb.append(ch); } } if(sb.length() > 0){ list.add(sb.toString().toCharArray()); sb.delete(0, sb.length()); } for(int i=0;i<list.size();i++){ System.out.println(java.util.Arrays.toString(list.get(i))); } } public static void main(String[] args) { String str = "abc123de45f67"; char[] c = getChar(str); System.out.println(Arrays.toString(c)); } public static char[] getChar(String info) { String[] str = info.split("\\D+"); char[] c = {}; for (String s : str) { if (!"".equals(s)) { c = Arrays.copyOf(c, c.length + 1); c[c.length - 1] = (char) Integer.parseInt(s); } } return c; } 跑了一下,就三楼哥们的code出结果了。。 var su=/[\\+\\*/-]/; szi=ww.split(su);这是取数字,字符没弄出来。建议去看看正则表达式。 查看了一下API这么写应该是可以满足要求的Pattern p = Pattern.compile("\\D+");String[] numbers = p.split("abc123de45f67");for(String number:numbers){ if(null!=number && !"".equals(number)) System.out.println(number);} public static void main(String[] args)throws Exception { //查询本字符串中的数字,并把数据放到char数组中. String str = "abc123de45f67"; //保存最终结果 List<char[]> list = new ArrayList<char[]>(); //用于收集数字 StringBuffer sb = new StringBuffer(); //true表示当前是数字,false表示当前是字母. boolean find = false; for(int i=0,j=str.length();i<j;i++){ //取当前一个字符. char ch = str.charAt(i); //if(ch >= '0' && ch <= '9'){ if( '0' <= ch && ch <= '9'){ //当前是数字 find = true; }else{ //当前是字母 find = false; //保存之前的数字到list if(sb.length() > 0){ list.add(sb.toString().toCharArray()); sb.delete(0, sb.length()); } } //当前是数字,则收集数字. if(find){ sb.append(ch); } } //收集数字. if(sb.length() > 0){ list.add(sb.toString().toCharArray()); sb.delete(0, sb.length()); } //打印结果.list的元素类型是char[]数组. for(int i=0;i<list.size();i++){ System.out.println(java.util.Arrays.toString(list.get(i))); }我认为3#原创作者,知道怎么用正则表达式.只想他想温习一下代码操纵字符的功力.谢谢. 对了,忘了说还有一点.在单线程下StringBuilder比StringBuffer效率高.所以上面的代码应该使用StringBuilder. 多线程下StringBuilder也比StringBuffer效率高,自己好好琢磨琢磨....... 你好我想了一下.找JDK源码:########################################################### StringBuffer部分方法源码. /** * @see java.lang.String#valueOf(java.lang.Object) * @see #append(java.lang.String) */ public synchronized StringBuffer append(Object obj) { super.append(String.valueOf(obj)); return this; } public synchronized StringBuffer append(String str) { super.append(str); return this; } StringBuilder部分方法源码 /** * @see java.lang.String#valueOf(java.lang.Object) * @see #append(java.lang.String) */ public StringBuilder append(Object obj) { return append(String.valueOf(obj)); } public StringBuilder append(String str) { super.append(str); return this; }###################################################可见StringBuffer的方法使用了同步,所以它慢.而StringBuilder的方法没有使用同步所以不能用会多线程环境下.所以我说:------在单线程下StringBuilder比StringBuffer效率高.--------有一个前提是在单线程环境下去比较它们俩个,因为在单线程下它们都是安全的,才有可比性.而在多线程情况下StringBuilder不保证同步所以没有可以比较的前提。JDK文件中也说:---- public final class StringBuilderextends Objectimplements Serializable, CharSequence一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。并且我还写了一个代码:在我的机器上的运行情况见图片:public static void main(String[] args) { //操作次数 int count = 9999999; StringBuffer sBuffer = new StringBuffer(); //开始任务A,记时开始. Long startTime = System.currentTimeMillis(); for(int i=0; i<count; i++){ sBuffer.append("A"); } //任务A,记时结束. Long endTime = System.currentTimeMillis(); //记录任务A所用时间 Long jobATime = endTime - startTime; //开始任务B,记时开始. StringBuilder sBuilder = new StringBuilder(); startTime = System.currentTimeMillis(); for(int i=0; i<count; i++){ sBuilder.append("B"); } //任务B,记时结束. endTime = System.currentTimeMillis(); //记录任务B所用的时间. Long jobBTime = endTime - startTime; System.out.println("任务A(StringBuffer)-------任务B(StringBuilder)"); System.out.println(jobATime+"------------------------------"+jobBTime); } 3楼的也对,不过不够好,,楼上的是对的,用String的split方法,里面是正则表达式,就可以实现了,只要一句话 简单的就是正则表达式 麻烦一点的是 AScll 可以使用正则表达式pattern = ...matcher = ...while(matcher.find()){ sysout(matcher.group());} 可以试一下 Pattern p = Pattern.compile("\\d+");String s = "abc123de45f67";Matcher m = p.matcher(s); while(m.find()){p(m.group());} 求算法高手 我的Myeclipse出问题了,谁能解决一下! java序列化是什么意思 关于创建对像以自身作为参数的问题 大家好麻烦看看这个程序怎么有错误呢? 请问JBuilder 2006 需要多大的内存配置?谢谢! 关于GUI事件监听的问题。。 哪位帮我看看这个全排列算法 帮忙看看代码。。。。 关于StreamTokenizer,大家来看看? 我要顶边,,nice 正则表达式问题
Pattern p = Pattern.compile("[\\d]+");
Matcher m = p.matcher(abc123de45f67);
//m.matches();
public static void main(String[] args)throws Exception {
String str = "abc123de45f67";
List<char[]> list = new ArrayList<char[]>();
StringBuffer sb = new StringBuffer();
boolean find = false;
for(int i=0,j=str.length();i<j;i++){
char ch = str.charAt(i);
if(ch >= '0' && ch <= '9'){
find = true;
}else{
find = false;
if(sb.length() > 0){
list.add(sb.toString().toCharArray());
sb.delete(0, sb.length());
}
}
if(find){
sb.append(ch);
}
}
if(sb.length() > 0){
list.add(sb.toString().toCharArray());
sb.delete(0, sb.length());
}
for(int i=0;i<list.size();i++){
System.out.println(java.util.Arrays.toString(list.get(i)));
}
}
public static void main(String[] args) {
String str = "abc123de45f67";
char[] c = getChar(str);
System.out.println(Arrays.toString(c));
} public static char[] getChar(String info) {
String[] str = info.split("\\D+");
char[] c = {};
for (String s : str) {
if (!"".equals(s)) {
c = Arrays.copyOf(c, c.length + 1);
c[c.length - 1] = (char) Integer.parseInt(s);
}
}
return c;
}
跑了一下,就三楼哥们的code出结果了。。
szi=ww.split(su);
这是取数字,字符没弄出来。建议去看看正则表达式。
String[] numbers = p.split("abc123de45f67");
for(String number:numbers){
if(null!=number && !"".equals(number)) System.out.println(number);
}
//查询本字符串中的数字,并把数据放到char数组中.
String str = "abc123de45f67";
//保存最终结果
List<char[]> list = new ArrayList<char[]>();
//用于收集数字
StringBuffer sb = new StringBuffer();
//true表示当前是数字,false表示当前是字母.
boolean find = false;
for(int i=0,j=str.length();i<j;i++){
//取当前一个字符.
char ch = str.charAt(i);
//if(ch >= '0' && ch <= '9'){
if( '0' <= ch && ch <= '9'){
//当前是数字
find = true;
}else{
//当前是字母
find = false;
//保存之前的数字到list
if(sb.length() > 0){
list.add(sb.toString().toCharArray());
sb.delete(0, sb.length());
}
}
//当前是数字,则收集数字.
if(find){
sb.append(ch);
}
}
//收集数字.
if(sb.length() > 0){
list.add(sb.toString().toCharArray());
sb.delete(0, sb.length());
}
//打印结果.list的元素类型是char[]数组.
for(int i=0;i<list.size();i++){
System.out.println(java.util.Arrays.toString(list.get(i)));
}
我认为3#原创作者,知道怎么用正则表达式.只想他想温习一下代码操纵字符的功力.
谢谢.
多线程下StringBuilder也比StringBuffer效率高,自己好好琢磨琢磨.......
你好我想了一下.
找JDK源码:
###########################################################
StringBuffer部分方法源码.
/**
* @see java.lang.String#valueOf(java.lang.Object)
* @see #append(java.lang.String)
*/
public synchronized StringBuffer append(Object obj) {
super.append(String.valueOf(obj));
return this;
}
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
StringBuilder部分方法源码
/**
* @see java.lang.String#valueOf(java.lang.Object)
* @see #append(java.lang.String)
*/
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
}
public StringBuilder append(String str) {
super.append(str);
return this;
}
###################################################
可见StringBuffer的方法使用了同步,所以它慢.而StringBuilder的方法没有使用同步所以不能用会多线程环境下.
所以我说:------在单线程下StringBuilder比StringBuffer效率高.--------有一个前提是在单线程环境下去比较它们俩个,因为在单线程下它们都是安全的,才有可比性.而在多线程情况下StringBuilder不保证同步所以没有可以比较的前提。
JDK文件中也说:----
public final class StringBuilderextends Objectimplements Serializable, CharSequence一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。并且我还写了一个代码:
在我的机器上的运行情况见图片:
public static void main(String[] args) {
//操作次数
int count = 9999999;
StringBuffer sBuffer = new StringBuffer();
//开始任务A,记时开始.
Long startTime = System.currentTimeMillis();
for(int i=0; i<count; i++){
sBuffer.append("A");
}
//任务A,记时结束.
Long endTime = System.currentTimeMillis();
//记录任务A所用时间
Long jobATime = endTime - startTime;
//开始任务B,记时开始.
StringBuilder sBuilder = new StringBuilder();
startTime = System.currentTimeMillis();
for(int i=0; i<count; i++){
sBuilder.append("B");
}
//任务B,记时结束.
endTime = System.currentTimeMillis();
//记录任务B所用的时间.
Long jobBTime = endTime - startTime;
System.out.println("任务A(StringBuffer)-------任务B(StringBuilder)");
System.out.println(jobATime+"------------------------------"+jobBTime);
}
pattern = ...
matcher = ...
while(matcher.find()){
sysout(matcher.group());
}
可以试一下
String s = "abc123de45f67";
Matcher m = p.matcher(s);
while(m.find()){
p(m.group());
}