正则表达式

说真的正则表达式真不好写,当我收集资料准备开始写的时候,发现收集的东西越来越多范围也越来越广,我文章的前提就是文章要清晰,

在缕清自己思路之后,我从先简后难的方式来写有关正表达式,你们如果觉得这篇写的还可以的话,可以先关注我,接下来我会陆续更新。

  一.什么是正则表达式

正则表达式(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)的更多相关文章

  1. 9.JAVA中的正则表达式

    一.JAVA中的正则表达式 1.概念:以某种特定的方式描述字符串 1.Java中正则表达式的规则 ?          #{0,1}-?有一个-或者没有 \\           #表示一个" ...

  2. Java提高篇——对象克隆(复制)

    假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...

  3. Java提高篇(三三)-----Map总结

    在前面LZ详细介绍了HashMap.HashTable.TreeMap的实现方法,从数据结构.实现原理.源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结. ...

  4. Java提高篇(三二)-----List总结

    前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...

  5. Java提高篇(三一)-----Stack

    在Java中Stack类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的.每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下: Stack通过 ...

  6. java提高篇(三十)-----Iterator

    迭代对于我们搞Java的来说绝对不陌生.我们常常使用JDK提供的迭代接口进行Java集合的迭代. Iterator iterator = list.iterator(); while(iterator ...

  7. java提高篇(二九)-----Vector

    在java提高篇(二一)-–ArrayList.java提高篇(二二)-LinkedList,详细讲解了ArrayList.linkedList的原理和实现过程,对于List接口这里还介绍一个它的实现 ...

  8. Java提高篇(二八)------TreeSet

    与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在<Java提高篇(二七)-----TreeMap>中LZ详细讲解了TreeMap实现机制,如果 ...

  9. Java提高篇(二七)-----TreeMap

    TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解,其实这篇博文的名字叫做:根据红黑树的算法来分析TreeMap的实现,但是为了与Java提高篇系列博文保持一致 ...

  10. Java提高篇(二六)-----hashCode

          在前面三篇博文中LZ讲解了(HashMap.HashSet.HashTable),在其中LZ不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最 ...

随机推荐

  1. 四、PyQt5布局管理(绝对&相对、水平、垂直、格栅、表单)

    目录 一.绝对布局 二.盒布局 三.格栅布局 四.格栅布局跨行跨列显示 布局管理即设置窗体上各个控件的位置,对于新手来说,这是学习的难点. 布局管理根据绝对坐标是否变动分为绝对布局和相对布局两大类.采 ...

  2. Chapter5_初始化与清理_构造器初始化

    一.构造器初始化的基本顺序 在使用构造器进行初始化时,最需要注意的是初始化的顺序,这种方法可以给初始化的顺序带来很大的灵活性.看如下的一个例子. class Window{ Window(int ma ...

  3. kali配置python3的开发环境

    最近打算学习一下python3,毕竟不会写脚本的程序员,不是一个好的安全测试人员! 对于我来说,python的大部分应用都是在linux上,而kali是我唯一一个有图形化操作界面的linux系统 所以 ...

  4. ehcache缓存使用

    CacheUtils.java //工具类 保存cache缓存: CacheUtils.put(CacheUtils.SIGN_CACHE, childid + "_" + mNu ...

  5. Git使用(一、TortoiseGit和Gitlab在Windows下的项目库创建和上传)

    介绍使用TortoiseGit初次创建并上传到gitlab项目库,转载请注明出处. 一.需要先安装git环境,并配置Git用户名及邮箱. 二.用PuTTYgen生成公约私钥对(鼠标画画).PuTTYg ...

  6. X86给龙芯笔记本编译本地工具链(未完待续)

    我买了一台龙芯2F的笔记本来当玩具. 买回来发现,这台笔记本上没法安装软件,因为既没有软件仓库,也没有GCC. 因此需要构建交叉工具链和构建本地工具链. 下面是我研究如何搞定着一切的笔记. 工具链组件 ...

  7. File(File f, String child) File(String parent, String child)

    (转载)File(File f, String child) 根据f 抽象路径名和 child 路径名字符串创建一个新 File 实例. f抽象路径名用于表示目录,child 路径名字符串用于表示目录 ...

  8. 从git远程仓库Checkout项目到本地

    一.登录coding  并且项目已创建好  已经是项目的组员 二.打开idea 1.弹出如下页面  复制远程项目上的SSH(URL)到下框URL 并且Test测试 成功就Clone即可 2.Clone ...

  9. SaaS应用十大关键NFR - 第2部分

    SaaS应用十大关键NFR - 第2部分 在继续上一篇关于SaaS应用的十大关键NFR的博客之后,我们来看看接下来的5个对SaaS解决方案架构产生深刻影响的关键NFR. SaaS应用的关键NFR 多租 ...

  10. 28.TreeSet

    与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在前一篇中详细讲解了TreeMap实现机制,如果客官详细看了这篇博文或者对TreeMap有比较详细的了解,那 ...