使用java正则表达式的正确姿势

文章目录

  • 使用java正则表达式的正确姿势
    • 一、用途
    • 二、. * + ? 表示什么意思?
    • 三、[]表示什么意思?(控制范围)
    • 四、常用的"\字母"表示什么意思?
    • 五、边界
    • 六、matches、find、lookingAt
    • 七、replacement字符串替换
    • 八、group分组
    • 九、读取本地网页中的email地址
    • 十、其他知识
    • 十一、有待补充 qulifiers (greedy reluctant possessive的区别)

一、用途

  1. 用于字符串处理

    • 字符串匹配
    • 字符串查找
    • 字符串替换
  2. 例子
    • IP地址是否正确
    • 从网页中揪出email地址
    • 从网页中揪出链接等
  3. 使用的类
    • java.lang.String
    • java.util.regex.Pattern
    • java.util.regex.Matcher

二、. * + ? 表示什么意思?

  1. *表示是一个字符
  2. X*表示X出现0个或多个
  3. X+表示出现1个或多个
  4. X?表示X出现0个或1个
  5. X{n}表示X出现n次
  6. X{n,}X最少出现n次,最多出现次数不限制
  7. X{n,m}X出现至少n次,不超过m次
  8. {}表示对字符出现次数的限制
  9. [-]表示限制字符范围
    10.[a-z]表示字符范围只能是a-z

示例代码:

        //初步认识. * + ? {} []p("a".matches("."));//truep("aa".matches("aa"));//truep("aaaa".matches("a*"));//truep("aaaa".matches("a+"));//truep("".matches("a*"));//truep("aaaa".matches("a?"));//falsep("".matches("a?"));//truep("a".matches("a?"));//truep("21234567898".matches("\\d{3,100}"));//truep("192.168.0.aaa".matches("\\d(1,3)\\.\\d(1,3)\\.\\d(1,3)\\.\\d(1,3)"));//falsep("192".matches("[0-2][0-9][0-9]"));//trueprivate static void p(Object o){System.out.println(o);}

三、[]表示什么意思?(控制范围)

  1. []表示匹配[]内其中一个字符
  2. ^表示取反
  3. -表示范围
  4. |表示或者 &&表示并且
    示例代码:
 public static void main(String[] args) {//范围p("a".matches("[abc]"));//匹配abc其中的一个字符 truep("a".matches("^abc"));//匹配abc之外的字符 false//匹配a-z或者A-Z之间的字符 3种写法p("A".matches("[a-zA-Z]"));//truep("A".matches("[a-z]|[A-Z]"));//truep("A".matches("[a-z[A-Z]]"));//truep("R".matches("[A-Z&&[RFG]]"));//A-Z之间并且是RFG三者之一 true}private static void p(Object o){System.out.println(o);}

四、常用的"\字母"表示什么意思?

  1. \d表示0-9之间的数字 [0-9]
  2. \D表示除0-9之外的字符 [^0-9]
  3. \s表示一个空白字符[ \t\n\x0b\f\r] 包含空格tab键等
  4. \S表示不包含空白字符[^\s]
  5. \w表示包含构成英文单词的字符[a-zA-Z_0-9]
  6. \W表示不包含英文单词的字符[^\w]

示例:

          //认识\s \w \d \p(" \n\r\t".matches("\\s{4}"));//truep(" ".matches("\\S"));//falsep("a_0".matches("\\w{3}"));//truep("abc888&^%".matches("[a-z]{1,3}\\d+[&^%]+"));//truep("\\".matches("\\\\"));// java比较反斜杠 trueprivate static void p(Object o){System.out.println(o);}

五、边界

^ 表示起始位置
$ 表示结束位置
\b表示一个单词的边界(边界指的是空格、换行、空白字符、tab键等)

示例:

         //边界p("hello sir".matches("^h.*"));//h开头后面跟0个或者多个字符 truep("hello sir".matches(".*ir$"));//ir结尾前面有0个或者多个字符 truep("hello sir".matches("^h[a-z]{1,3}o\\b.*"));//h开头,o后面是否包含单词边界 truep("hellosir".matches("^h[a-z]{1,3}o\\b.*"));//h开头,o后面是否包含单词边界 falseprivate static void p(Object o){System.out.println(o);}

六、matches、find、lookingAt

matches匹配整个字符串
find找子串
lookAt从开始位置找

示例代码:

         Pattern p = Pattern.compile("\\d{3,5}");//全部为数字,长度为3-5String s = "123-23234-234-00";Matcher m = p.matcher(s);p(m.matches());//falsem.reset();//matches和find一起使用会出现问题,一般要加reset,否则输出结果会有出入//find 依次查找子串p(m.find());//true//输出找到子串以后的开始位置和结束位置(前提是必须能找到这子串,否则会报错)p(m.start() + "-" + m.end());//输出0-3p(m.find());//truep(m.start() + "-" + m.end());//输出4-9p(m.find());//truep(m.start() + "-" + m.end());//输出10-13p(m.find());//false//lookingAt从开始位置找,每次从开头开始找p(m.lookingAt());//truep(m.lookingAt());//truep(m.lookingAt());//truep(m.lookingAt());//true}private static void p(Object o){System.out.println(o);}

七、replacement字符串替换

示例代码:

        //字符串替换replacementPattern pattern = Pattern.compile("java",Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher("java JAVA JAva JaVa JAvA iloveJava you hate java");//把字符串中所有的java(忽略大小写),全部替换成大写的JAVAp(matcher.replaceAll("JAVA"));private static void p(Object o){System.out.println(o);}

输出结果如下:

示例代码2:

 //字符串替换replacementPattern pattern = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//忽略大小写Matcher matcher = pattern.matcher("java JAVA JAva JaVa JAvA iloveJava you hate java the end");//要求把找到的第一个java字符串编程大写,找到的第二个变成小写,依次类推StringBuffer buffer = new StringBuffer();int i = 0;while (matcher.find()){i++;if(i % 2 == 0){matcher.appendReplacement(buffer,"java");}else {matcher.appendReplacement(buffer,"JAVA");}}matcher.appendTail(buffer);//加上尾巴p(buffer);}private static void p(Object o){System.out.println(o);}

输出结果:

八、group分组

如何判断是第几组,数小括号就行
作用:抓取字符串中的部分内容

示例代码:

         //分组Pattern pattern = Pattern.compile("(\\d{3,5})([a-z]{2})");//匹配3-5位的数字,两个字母String s = "123aa-345345bb-234cc-00";Matcher matcher = pattern.matcher(s);while (matcher.find()){//只输出3-5位的数字也就是第一组p(matcher.group(1));//只输出两位字母也就是第二组// p(matcher.group(2));private static void p(Object o){System.out.println(o);}

输出结果:

如果group传入的是2,则输出如下:

如果group什么都不传,则输出结果如下:

九、读取本地网页中的email地址

示例代码:

public class EmailSpider {public static void main(String[] args) {try {BufferedReader br = new BufferedReader(new FileReader("E:\\留下你的电子邮箱地址,我们来写Email吧。.html"));String line = "";while ((line = br.readLine()) != null){//判断有没有读到结尾parse(line);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}private static void parse(String line) {Pattern pattern = Pattern.compile("^\\s*\\w+(?:\\.{0,1}[\\w-]+)*@[a-zA-Z0-9]+(?:[-.][a-zA-Z0-9]+)*\\.[a-zA-Z]+\\s*$");Matcher matcher = pattern.matcher(line);while (matcher.find()){System.out.println(matcher.group());}}}

十、其他知识

向前引用:

示例代码:

//向前引用Pattern pattern = Pattern.compile("(\\d\\d)\\1");// \\1指的是后面找到的结果必须和第一个组捕捉的字符串一样String s = "1214";//false
//        String s = "1212";//trueMatcher matcher = pattern.matcher(s);System.out.println(matcher.matches());

忽略大小写或者其他规则可以用下面这种写法:

     //忽略大小写//第一种写法Pattern pattern = Pattern.compile("java",Pattern.CASE_INSENSITIVE);//第二种写法p("java".matches("(?i)(java)"));

十一、有待补充 qulifiers (greedy reluctant possessive的区别)

使用java正则表达式的正确姿势相关推荐

  1. linux下使用update-alternatives切换java版本的正确姿势

    点击打开链接 关于update-alternatives命令的使用,请见: http://blog.csdn.net/54powerman/article/details/54572195 之前的文章 ...

  2. 【Java】Java获取昨天日期的正确姿势

    Java获取昨天的日期,其实大部分人都用得不对: DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd");Calendar ...

  3. 学习 Java 的正确姿势

    2019独角兽企业重金招聘Python工程师标准>>> 关于学习 Java 的正确姿势,以下几点是网上看到的,觉得和我的想法差不多,于是分享一下.可能和时下有些人的想法大相径庭,但是 ...

  4. java线程池shutdown_关闭线程池的正确姿势,shutdown(), shutdownNow()和awaitTermination() 该怎么用?...

    关闭线程池的正确姿势,shutdown(), shutdownNow()和awaitTermination() 该怎么用? ExecutorService 接口提供了三个方法用于手动关闭线程池,分别是 ...

  5. eclipse连接mysql_专题一、flask构建mysql数据库正确姿势

    每周壹总结,一起共同充电第121篇 应用程序最核心的就是数据,每天我们写程序其实也是在处理数据的过程,那么很有必要系统性的讲讲和梳理python的flask框架是如何进行数据交互操作的. 趁这3天假期 ...

  6. Golang错误和异常处理的正确姿势

    Golang错误和异常处理的正确姿势 错误和异常是两个不同的概念,非常容易混淆.很多程序员习惯将一切非正常情况都看做错误,而不区分错误和异常,即使程序中可能有异常抛出,也将异常及时捕获并转换成错误.从 ...

  7. java正则表达式课程_通过此免费课程学习正则表达式

    java正则表达式课程 by Beau Carnes 通过博卡恩斯 通过此免费课程学习正则表达式 (Learn Regular Expressions with this free course) & ...

  8. 互联网大厂内推求职的正确姿势?

    作者 | 码农唐磊 来源 | 程序猿石头(ID:tangleithu) 背景 每个人的职业生涯基本上都离不开"投简历找工作"这件事(什么,你家里有矿?当我没说),那拿着简历找工作正 ...

  9. 开发函数计算的正确姿势 —— 爬虫

    2019独角兽企业重金招聘Python工程师标准>>> 在 <函数计算本地运行与调试 - Fun Local 基本用法> 中,我们介绍了利用 Fun Local 本地运行 ...

最新文章

  1. [转]SIFT特征提取分析
  2. 基金委新规:填写论文成果,不再标注通讯和一作!影响有多大?
  3. oracle索引大小暴增_oracle 如何预估将要创建的索引的大小
  4. Android之Bmob移动后端云服务器
  5. 【STM32 .Net MF开发板学习-18】GPRS遥控智能小车
  6. 在SQL中使用DEFAULT约束
  7. zookeeper命令行操作
  8. 【Python】pdfminer3k模块批量转换本地PDF文件
  9. rar linux下载64位下载地址,Linux中下载WinRAR并使用它解压rar文件
  10. PHP留言板之提交留言
  11. 2014_hitcon_stkof学习
  12. 机器学习:Kmeans聚类算法总结及GPU配置加速demo
  13. 三角形花园和向左走(三角形性质和点集排序)
  14. bat并行调用打包bat总结
  15. Pytorch基础学习(第一章-PyTorch基础概念)
  16. 海康2017校招C++开发岗位笔试题
  17. c语言的int型运算符,C语言运算符
  18. 使用 dcm4che 操作 Dicom 文件
  19. 2021显卡、CPU天梯图
  20. 洛谷 1498 南蛮图腾

热门文章

  1. 恶意软件借助表情包现身Twitter
  2. 微信小程序之校园摆渡车系统
  3. mac终端查看端口命令
  4. mysql服务修复工具_MySQL Recovery Toolbox
  5. linux 同步时间命令
  6. 完美修复服务器频道错误,(完全免费无限制)全速更新,完美修复Playerbot商业开服端...
  7. 人工智能细分领域常用的开发软件是什么?
  8. 怎么将素材图片背景变透明?如何一键抠除图片背景?
  9. 在WINCC中使用自定义的动画效果控件ocx
  10. Mac下python升级