java提高(3)---正则表达式(2)
正则表达式
说真的正则表达式真不好写,当我收集资料准备开始写的时候,发现收集的东西越来越多范围也越来越广,我文章的前提就是文章要清晰,
在缕清自己思路之后,我从先简后难的方式来写有关正表达式,你们如果觉得这篇写的还可以的话,可以先关注我,接下来我会陆续更新。
一.什么是正则表达式
正则表达式(regular expressions)是一种描述字符串集的方法,它是以字符串集中各字符串的共有特征为依据的。
正则表达式可以用于搜索、编辑或者是操作文本和数据。这是官方表达听的有点绕口,用通俗的话来说就是:正则表达式主要用来处理和文本有关的内容
常见的处理方式有四种:1.匹配 2.切割 3.替换 4.获取 在下面我也会一一举例说明。
二.正则表达式常见的符号含义
这个我在正则表达式(1)中,有关常用的也大概做个介绍,大家可以往前翻阅。
三.常见的处理方式有四种
(1)匹配 我这里使用的是字符串对象的方法 match(String regex),
import java.util.regex.*;
public class TestException{
public static void main(String[] args) throws Exception {
String tel="18600000111";
String reg="1[3578]\\d{9}"; //首字母1,第二字母3,5,7,8,后面都是数字共有9位
boolean b1 =tel.matches(reg);
System.out.println(b1);//输出结果true
}
}
(2)切割 我这里使用的是字符串中的split方法
案例一:切割一个或多个空格
//切割一个或者多个空格
import java.util.regex.*;
public class TestException{
public static void main(String[] args) throws Exception {
String str ="aaa bbb ccc ddd eee";
String [] arr =str.split(" +");//“ +”表示至少有一个空格
for(String s:arr){
System.out.print(s);
}
}
}
运行结果;
aaabbbcccdddeee
案例二:通过.来切割字符串
//通过.来切割字符串
import java.util.regex.*;
public class TestException{
public static void main(String[] args) {
String str2="zhangsan.lisi.wangwu";
/* \\是代表转义字符,如果你直接放split("."),是无法切割的,因为.在正则表达式中.有它特有的含义
当你用转义之后\\.那么它就只代表一个点,而不具有特殊意义*/
String [] arr2 =str2.split("\\.");
for(String s:arr2){
System.out.println(s);
}
}
}
/* 补充:在java中需要转义的除了.外,还有需要先转义不能直接切割的:
* $ ( ) * + [ ] ? \ ^ { } |
* 这么几个大家用它来切割的时候,转义后就可以了
*/
运行结果:
zhangsan
lisi
wangwu
案例三:用重复项来切割
//用重复项来切割
import java.util.regex.*;
public class TestException{
public static void main(String[] args) {
String str3 ="wer#######tayuio****asdfg";
String reg ="(..)"; //(.)代表第一个任意字符 \\1代表回去第一组数据 +代表1个或者多个
String [] arr3=str3.split(reg);
for(String s:arr3){
System.out.println(s);
}
}
}
/* 补充:我怕初学者对"(.)\\1+",还没有搞懂,我这里在单独解释一下:(.)的字符视为一个整体。 \\1代表回去第一组数据
* 那它其实在这里也就代表(.),所以就相当于(.)(.)+,这里仅仅是相当于,也是为了好理解,其实他们还是有本质区别的
* 因为(.)==\\1,就是说如果.代表a,那么\\1也就代表a,而(.)≠(.),前面代表a后面可以代表b,因为前后两个点不是同一个点
* 我也不知道这样比较是否恰当, 反正意思就是这个意思
*/
运行结果:
wer
tayuio
asdfg
(3)替换 使用String字符串汇总的方法
案例一:把重复的数据 替换为#
//把重复的数据 替换为#
import java.util.regex.*;
public class TestException{
public static void main(String[] args) {
String str="wer#####yw****fghj";
//把重复的数据 替换为#
str=str.replaceAll("(.)\\1+", "#");//(.) 第一个任意字符 \\1 取第一组数据 + 1个或者多个
System.out.println(str) ;
}
}
运行结果:
wer#yw#fghj
案列二:把重复项都变成单个
import java.util.regex.*;
public class TestException{
public static void main(String[] args) {
String str="wer#####yw****fg???hj";
//后一个参数的含义 可以通过$ 数字引用第一个参数中的组,这个美元符号代表就是前面小括号里的内容
str=str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
}
运行结果:
wer#yw*fg?hj
案例三:电话号码中间几位用*表示
import java.util.regex.*;
public class TestException{
public static void main(String[] args) {
String str2="15889895644";//158****5644
str2=str2.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
System.out.println(str2);// $1表示符号前面第一个小括号,$2代表第二个,如果有第三个小括号,那也可以$3;
}
}
运行结果:
158****5644
(4)获取 字符串中没有直接提供该功能 只能通过正则表达匹配
案例一:获取正则表达式所匹配的字符串
import java.util.regex.*;
public class TestException{
public static void main(String[] args) {
String str="da jio zhu yi laa, ming tian fang jia laa";
//1.定义规则
String reg="\\b[a-z]{3}\\b";//任意三个字符 \\b 是单词的边界(明白为什么加这个)
Pattern p =Pattern.compile(reg);
//3.通过正则表达对象 获取匹配器对象 并把操作的字符串关联
Matcher m =p.matcher(str);
while(m.find()){ //find()用来搜索与正则表达式相匹配的任何目标字符串
System.out.println(m.start()+"....."+m.group()+"..."+m.end());
} //start()开始位置 group()用来返回包含了所匹配文本的字符串 end()结束位置
}
}
/* 有关: 在regex(正则表达式)包中,包括了两个类,Pattern(模式类)和Matcher(匹配器类)。
* 这个大家也可以多去了解
*/
运行结果:
3.....jio...6
7.....zhu...10
14.....laa...17
35.....jia...38
39.....laa...42
四:最后来一个综合小案例
题目1:10.10.10.10 192.168.118.40 192.168.1.200 127.0.0.108 按照升序排序
import java.util.Arrays;
import java.util.regex.*;
public class TestException{
public static void main(String[] args) {
String ip="10.10.10.10 192.168.118.40 192.168.1.200 127.0.0.108";
/*
* 为了方便 每一个端都补零 保证每一个字段至少是三位
*/
ip=ip.replaceAll("(\\d+)", "00$1");//补0,让至少有三位数 ip=ip.replaceAll("0*(\\d{3})", "$1");//所有都变成三位数 String [] ips =ip.split(" +");//用空格来切割
Arrays.sort(ips);//升序排序
for(String x:ips){
System.out.println(x.replaceAll("0*(\\d+)", "$1"));//还原
}
}
}
/** 这个题目或许看着不难,难就难在思维模式,它这每一步都很关键,也是希望大家在学习的途中多思考,而不是停留在看的基础上
*/
运行结果:
10.10.10.10
127.0.0.108
192.168.1.200
192.168.118.40
这篇文章到这里结束了,接下来对于正则表达式我还会再写,比如Pattern(模式类)和Matcher(匹配器类),再比如如何获取文本中的电话号码等等深入的一些东西,不过最近应该不写了,
接下来我会写一些其它有关的知识。
大家看完也欢迎做出点评,哪里写的不周到或者还可以更好的也欢迎提出,我会立即更正,谢谢!
java提高(3)---正则表达式(2)的更多相关文章
- 9.JAVA中的正则表达式
一.JAVA中的正则表达式 1.概念:以某种特定的方式描述字符串 1.Java中正则表达式的规则 ? #{0,1}-?有一个-或者没有 \\ #表示一个" ...
- Java提高篇——对象克隆(复制)
假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...
- Java提高篇(三三)-----Map总结
在前面LZ详细介绍了HashMap.HashTable.TreeMap的实现方法,从数据结构.实现原理.源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结. ...
- Java提高篇(三二)-----List总结
前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...
- Java提高篇(三一)-----Stack
在Java中Stack类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的.每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下: Stack通过 ...
- java提高篇(三十)-----Iterator
迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...
- java提高篇(二九)-----Vector
在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...
- Java提高篇(二八)------TreeSet
与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap>中LZ详细讲解了TreeMap实现机制,如果 ...
- Java提高篇(二七)-----TreeMap
TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...
- Java提高篇(二六)-----hashCode
在前面三篇博文中LZ讲解了(HashMap.HashSet.HashTable),在其中LZ不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最 ...
随机推荐
- C# WPF 父控件通过使用可视化树找到子控件
在我们使用WPF设计前台界面时,经常会重写数据模板,或者把控件放到数据模板里.但是一旦将控件放到数据模板中,在后台就没有办法通过控件的名字来获取它了,更没办法对它进行操作(例如,隐藏,改变控件的某个值 ...
- HDU-6153 A Secret 扩展KMP
题意:求一个字符串的所有后缀在母串中的出现次数*后缀的长度的总和. 题目链接:http://acm.split.hdu.edu.cn/viewcode.php?rid=22147273 思路:先预处理 ...
- nohup 运行后台程序
写了个程序,大概就是日志文件快写满的时候自动删日记.然后 java -jar log_delete.jar & 跑起来.过两天ps发现程序没有了, 网上一查明白是因为:通过终端(shel ...
- 大前端学习笔记【七】关于CSS再次整理
如果你在日常工作中使用 CSS,你的主要目标可能会重点围绕着使事情“看起来正确”.如何实现这一点经常是远不如最终结果那么重要.这意味着比起正确的语法和视觉结果来说,我们更少关心 CSS 的工作原理. ...
- ABP学习之旅
1.我使用ABP的启动模板(http://www.aspnetboilerplate.com/Templates)来创建一个Web应用程序. 2.加载项目解决方案 在abp根据模板创建解决方案后,编译 ...
- 解决Chrome 70及以上版本的证书问题:Failed to load resource: net::ERR_CERT_SYMANTEC_LEGACY
1.桌面必须要有Chrome 快捷方式 2.进入快捷方式属性 3.修改目标为:"C:\Program Files (x86)\Google\Chrome\Application\chrome ...
- vuex的getters处理数据
getters是用来处理state里的数据的 getters传递一个值state 例子: store.js import Vue from 'vue' import Vuex from 'vuex' ...
- Codeforces Round #545 (Div. 2) D 贪心 + kmp
https://codeforces.com/contest/1138/problem/D 题意 两个01串s和t,s中字符能相互交换,问最多能得到多少个(可交叉)的t 题解 即将s中的01塞进t中, ...
- DataStructs.h
#ifndef _DATASTRUCS_H__ #define _DATASTRUCS_H__ #include <systemc.h> #include "GlobalPara ...
- 《DevOps软件架构师行动指南》读后感
从软件架构师视角讲解了引入DevOps实践所需要拥有的技术能力,涵盖运维.部署流水线.监控.安全与审计以及质量关注,这是本书一开始内容简介的开头,本书的作者是伦恩·拜斯(Len Bass).英戈·韦伯 ...