配色: 字号:
java从字符串中提取数字的简单实例
2016-12-10 | 阅:  转:  |  分享 
  
java从字符串中提取数字的简单实例

用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰。



应用多线程来实现服务器与多线程之间的通信的基本步骤

1.服务器端创建ServerSocket,循环调用accept()等待客户端链接

2.客户端创建一个Socket并请求和服务器端链接

3.服务器端接受客户端请求,创建socekt与该客户端建立专线链接

4.建立链接的socket在一个单独的线程上对话

5.服务器继续等待新的链接



服务器端Server.java



packagetest.concurrent.socket;importjava.io.;importjava.net.InetAddress;importjava.net.ServerSocket;importjava.net.Socket;/Createdbydongon15-6-22.基于TCP协议的Socket通信,实现用户登录服务器端/publicclassServer{publicstaticvoidmain(String[]args){try{//1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口ServerSocketserverSocket=newServerSocket(8888);Socketsocket=null;//记录客户端的数量intcount=0;System.out.println("服务器即将启动,等待客户端的链接");//循环监听等待客户端的链接while(true){//调用accept()方法开始监听,等待客户端的链接socket=serverSocket.accept();//创建一个新的线程ServerThreadserverThread=newServerThread(socket);//启动线程serverThread.start();count++;//统计客户端的数量System.out.println("客户端的数量:"+count);InetAddressaddress=socket.getInetAddress();System.out.println("当前客户端的IP:"+address.getHostAddress());}}catch(IOExceptione){e.printStackTrace();}}}



服务器端线程处理类ServerThread.java



packagetest.concurrent.socket;importjava.io.;importjava.net.Socket;/Createdbydongon15-6-22.服务器端线程处理类/publicclassServerThreadextendsThread{//和本线程相关的SocketSocketsocket=null;publicServerThread(Socketsocket){this.socket=socket;}//线程执行的操作,响应客户端的请求publicvoidrun(){InputStreamis=null;InputStreamReaderisr=null;BufferedReaderbr=null;OutputStreamos=null;PrintWriterpw=null;try{//获取一个输入流,并读取客户端的信息is=socket.getInputStream();isr=newInputStreamReader(is);//将字节流转化为字符流br=newBufferedReader(isr);//添加缓冲Stringinfo=null;//循环读取数据while((info=br.readLine())!=null){System.out.println("我是服务器,客户端说:"+info);}socket.shutdownInput();//关闭输入流//获取输出流,响应客户端的请求os=socket.getOutputStream();pw=newPrintWriter(os);//包装为打印流pw.write("欢迎你");pw.flush();//将缓存输出}catch(IOExceptione){e.printStackTrace();}finally{try{//关闭资源if(pw!=null)pw.close();if(os!=null)os.close();if(is!=null)is.close();if(isr!=null)isr.close();if(br!=null)br.close();if(socket!=null)socket.close();}catch(IOExceptione){e.printStackTrace();}}}}

客户端Client.java



packagetest.concurrent.socket;importjava.io.;importjava.net.Socket;/Createdbydongon15-6-22.客户端/publicclassClient{publicstaticvoidmain(String[]args){try{//1、创建客户端Socket,指定服务器端口号和地址Socketsocket=newSocket("localhost",8888);//2、获取输出流,向服务器发送信息OutputStreamos=socket.getOutputStream();//字节输出流PrintWriterpw=newPrintWriter(os);//将输出流包装为打印流pw.write("用户名:tom;密码:456");pw.flush();socket.shutdownOutput();//关闭输出流InputStreamis=socket.getInputStream();InputStreamReaderisr=newInputStreamReader(is);BufferedReaderbr=newBufferedReader(isr);Stringinfo=null;//循环读取while((info=br.readLine())!=null){System.out.println("我是客户端:服务器说:"+info);}br.close();is.close();isr.close();pw.close();os.close();socket.close();}catch(IOExceptione){e.printStackTrace();}}}



随便给你一个含有数字的字符串,比如:



Strings="eert343dfg56756dtry66fggg89dfgf";



那我们如何把其中的数字提取出来呢?大致有以下几种方法,正则表达式,集合类,还有就是String类提供的方法。



1String类提供的方法:



package测试练习;importJava.util.;publicclassget_StringNum{/2016.10.25/publicstaticvoidmain(String[]args){Stringstr="love23next234csdn3423javaeye";str=str.trim();Stringstr2="";if(str!=null&&!"".equals(str)){for(inti=0;i=48&&str.charAt(i)<=57){str2+=str.charAt(i);}}}System.out.www.visa158.comprintln(str2);}}output:232343423



这个方法有个明显的缺点,只能把数字全部提取到一起,不能分别提取。当然也可以改进,有兴趣的朋友可以试试。



2正则表达式



importjava.util.;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassget_StringNum{/2016.10.25/publicstaticvoidmain(String[]args){Stringa="love23next234csdn3423javaeye";StringregEx="[^0-9]";Patternp=Pattern.compile(regEx);Matcherm=p.matcher(a);System.out.println(m.replaceAll("").trim());}}output:232343423



Pattern,Matcher是java.util.regex软件包里的两个类,具体用法大家可以查阅一下api。同样也不能单个提取数字。



3集合类库



importjava.util.;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassget_StringNum{/2016.10.25/publicstaticvoidmain(String[]args){Stringa="love23next234csdn3423javaeye";ListdigitList=newArrayList();Patternp=Pattern.compile("[^0-9]");Matcherm=p.matcher(a);Stringresult=m.www.visa158.comreplaceAll("");for(inti=0;i


相同的思路:



importjava.util.;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassget_StringNum{/2016.10.25/publicstaticvoidmain(String[]args){Stringa="love23next234csdn3423javaeye";Listss=newArrayList();for(Stringsss:s.replaceAll("[^0-9]",",").split(",")){if(sss.length()>0)ss.add(sss);}System.out.print(ss);}}output:[2,3,2,3,4,3,4,2,3]



很明显,利用正则表达式我们就可以分别提取数字了。



另外还有一个利用查阅文档找出的答案,如下:



/从字符串文本中获得数字@paramtext@return/publicstaticListgetDigit(Stringtext){ListdigitList=newArrayList();Patternp=Pattern.compile("(\\d+)");Matcherm=p.matcher(text);while(m.find()){Stringfind=m.group(1).toString();digitList.add(Long.valueOf(find));}returndigitList;}



两个用正则表达式匹配的判断方法,如下;



//判断一个字符串是否都为数字publicbooleanisDigit(StringstrNum){returnstrNum.matches("[0-9]{1,}");}//判断一个字符串是否都为数字publicbooleanisDigit(StringstrNum){Patternpattern=Pattern.compile("[0-9]{1,}");Matchermatcher=pattern.matcher((CharSequence)strNum);returnmatcher.matches();}//截取数字publicStringgetNumbers(Stringcontent){Patternpattern=Pattern.compile("\\d+");Matchermatcher=pattern.matcher(content);while(matcher.find()){returnmatcher.group(0);}return"";}//截取非数字publicStringsplitNotNumber(Stringcontent){Patternpattern=Pattern.compile("\\D+");Matchermatcher=pattern.matcher(content);while(matcher.find()){returnmatcher.group(0);}return"";}





















献花(0)
+1
(本文系白狐一梦首藏)