Java 正则表达式里find()方法的使用

package com.zte.st.dailybuild.dao;import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** Created by 6092002943 on 2020/3/28.*/
public class Test {public static void main(String[] args) {Pattern p = Pattern.compile("\\d{3,5}");Matcher m = p.matcher("123-4567812-910-11");/*print (m.matches ());
m.reset ();*/print(m.find());//trueprint(m.group());//123print(m.start() + "-" + m.end());//0-3: 1~-System.out.printf("换行--------------------\n");print(m.find());//trueprint(m.group());//45678print(m.start() + "-" + m.end());//4-9: 4~1System.out.printf("换行--------------------\n");print(m.find());//trueprint(m.group());//910print(m.start() + "-" + m.end());//12-15:9~-System.out.printf("换行--------------------\n");print(m.find());//falseSystem.out.printf("换行--------------------\n");System.out.println();print(m.matches());//falseSystem.out.printf("换行\n");//m.reset ();print(m.find());//trueprint(m.group());//45678print(m.start() + "-" + m.end());//4-9System.out.printf("换行\n");print(m.find());//trueprint(m.group());//910print(m.start() + "-" + m.end());//12-15System.out.printf("换行\n");print(m.find());//falseSystem.out.printf("换行\n");print(m.find());//falseSystem.out.printf("换行\n");System.out.println();print(m.matches());//falseSystem.out.printf("换行\n");m.reset();print(m.find());//trueprint(m.group());//123print(m.start() + "-" + m.end());//0-3System.out.printf("换行\n");print(m.find());//trueprint(m.group());//45678print(m.start() + "-" + m.end());//4-9System.out.printf("换行\n");print(m.find());//trueprint(m.group());//910print(m.start() + "-" + m.end());//12-15System.out.printf("换行\n");print(m.find());//falseSystem.out.printf("换行\n");System.out.println();print(m.lookingAt());//trueprint(m.lookingAt());//true}public static void print(Object o) {System.out.println(o);}}

/*
*    对这个程序的解释:这个程序最大的难点在于find()方法的理解
*    在第一段程序中,find会一个字符一个字符的匹配,当检测到3的时候,发现已经有3个字符,那么这个find可以返回true了,但是没有完,它会继续检测,发现3的后面是-而不是数字,第一个find的结束,所以在group这个里输出123,从0到3(注意下标是从0开始的)
*    第二个find从下标为3的字符开始找,也就是上次find结束的地方,那么这个find一上来就找到-,会不会因此而返回false,答案是不会,它会继续往后面找,看能不能在后面的字符串中找到符合条件的字符串片段,很幸运,它找到了,那就是45678,因为指定的字符串
*   片段的上限长度为5,所以在group输出45678而不是4567812,那么下标的始末为什么是4-9而不是4-8呢?虽然字符串片段的指定上限是5,但并不会因此就不继续往后面检查一位。
*    第三个find从下标为9的地方开始找,1,2,-,发现都不行,继续找!9,1,0,-发现满足条件了,返回true,同时group里输出910,下标又为什么从12开始呢?因为find从下标为12处才找到满足条件的字符串片段。
*    第四个find很可怜,-,1,1都不满足,后面又没有字符串了,所以只好返回false了、
*    为什么加了matches和reset后输出结果又变得不一样了?先从matches说起,matches要求全部匹配才能返回true,但是很不幸字符串的长度一看就不止5个字符,所以返回false是毫无疑问的。具体来说,matches也是一个字符一个字符检查的,当他检查到第一个“-”时发现
*   不是数字了,所以返回了false(但是就算全部是数字也返回false,就如上面所说的),关键是这个matches对后面的find有影响,因为find是从matches停止位开始检查的,就像下一个find是从上一个find停止位开始检查的一样,所以输出结果和上一段不一样了。
*    但是加了reset后,匹配器被重置,就相当于find可以从字符串的第一个字符开始检查了。
*    lookingAt()是每一次都从头开始检查是不是符合要求,不管有多少个lookingAt(),而123是符合要求的,所以会输出true
*    注意只有匹配成功,才可以通过 start、end 和 group 方法获取更多信息。
*/

java中用正则表达式截取字符串中第一个出现的英文左括号之前的字符串。比如:北京市(海淀区)(朝阳区)(西城区),截取结果为:北京市。正则表达式为()

  • A   ".*?(?=\\()"
  • B   ".*?(?=\()"
  • C  ".*(?=\\()"
  • D  ".*(?=\()"

http://www.cnblogs.com/xudong-bupt/p/3586889.html

1.什么是正则表达式的贪婪与非贪婪匹配

如:String str="abcaxc";

Patter p="ab*c";

贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab*c)。

非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab*c)。

2.编程中如何区分两种模式

默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。

量词:{m,n}:m到n个

*:任意多个

+:一个到多个

?:0或一个

以上来自博主的博客,然后这道题目

.表示除\n之外的任意字符

*表示匹配0-无穷 
+表示匹配1-无穷

(?=Expression) 顺序环视,(?=\\()就是匹配正括号

懒惰模式正则: 
src=".*? (?=\\()) "

结果:北京市

因为匹配到第一个"就结束了一次匹配。不会继续向后匹配。因为他懒惰嘛。

A ".*?(?=\\()" 
B ".*?(?=\()"
C ".*(?=\\()"
D ".*(?=\()"

前面的.*?是非贪婪匹配的意思, 表示找到最小的就可以了

(?=Expression) 顺序环视,(?=\\()就是匹配正括号

String text = "北京市(海淀区)(朝阳区)(西城区)";Pattern pattern = Pattern.compile(".*?(?=\\()" );
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
System.out.println(matcher.group(0));
}

解析

选A, 知识点是正则表达式中的贪婪匹配。

1、正则表达式中元字符:

".":匹配除去\n换行符的任意字符

"*":匹配前面子表达式任意次

"?":匹配前面子表达式的0次或1次,如果前面也是元字符,那么它就是非贪婪匹配了(默认是贪婪匹配的)。

2、B中 ".*?(?=\\()"中后面的(?=\\()它是(?=assert)的形式,叫做顺序环视,也就是前面.*?匹配到的字符后面必须要紧接着有assrt中声明的值,也就是左括号(其中\\都是转义字符),但是匹配的到的串是不包含assrt中声明的内容的。

3、题中,原串 “北京市(海淀区)(朝阳区)(西城区)”,首先匹配到北京市(前部分),然后北京市后面有左括号( ,这是后面顺序环视部分,但是不包括左括号,这样整个串就匹配完了,截取到的串为“北京市”。

案例2:

Pattern pattern = Pattern.compile("[a-z|A-Z]{3}\\d+", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("DUT1DUT2DUT3");
ArrayList<String> list = new ArrayList<>();
while (matcher.find()) {System.out.println(matcher.group());}

输出:DUT1   DUT2  DUT3

参考文章:正则表达式Pattern和Matcher详解

java中的正则matches方法和find方法的区别相关推荐

  1. Hibernate中session的get方法和load方法的区别

    一.发送SQL时机: load方法采用延迟加载(lazy懒加载),执行到这行代码的时候,不会发送SQL语句,当真正使用这个对象的数据(对象的数据不包括主键)的时候才发送SQL语句: get方法采用立即 ...

  2. java——Scanner中nextLine()方法和next()方法的区别

    遇到一个有意思的东西,在整理字符串这块知识的时候,发现我在用Scanner函数时,在字符串中加入空格,结果空格后面的东西没有输出来(/尴尬),不多说直接上代码: import java.util.Sc ...

  3. Java 回调函数(传统方法和lambda方法)-一个例子秒懂

    原文地址为: Java 回调函数(传统方法和lambda方法)-一个例子秒懂 背景: 想写一个工具类 Tool.java ,其中方法 public void readOneLine() 负责一行一行地 ...

  4. Java并发编程—schedule方法和scheduleAtFixedRate方法的区别

    原文作者:一叶丿清风 原文地址:schedule方法和scheduleAtFixedRate方法的区别 schedule方法和scheduleAtFixedRate方法都可以实现任务的延时和不延时执行 ...

  5. ExtJS中listener方法和handler方法的区别

    listener方法和handler方法的区别在文档中的说明的太玄乎了,看不懂 listeners监听能够对一个click Event事件添加任意多个的事件响应处理函数 而handler处理只能够通过 ...

  6. python predict_对Keras中predict()方法和predict_classes()方法的区别说明

    1 predict()方法 当使用predict()方法进行预测时,返回值是数值,表示样本属于每一个类别的概率,我们可以使用numpy.argmax()方法找到样本以最大概率所属的类别作为样本的预测标 ...

  7. flush方法和close方法的区别

    package com.learn.Demo05Writer;import java.io.FileWriter; import java.io.IOException;/*flush方法和close ...

  8. 请简述一下线程的sleep()方法和yield()方法的区别?

    请简述一下线程的sleep()方法和yield()方法的区别? ①sleep()方法给其他线程机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会. yield()方法只会给相同优先级或更高优 ...

  9. dispose方法和setvisible方法的区别和使用

    dispose方法和setvisible方法的区别: dispose()撤销当前窗口,并释放当前窗口所使用的资源. setVisible()方法仅仅隐藏窗体,可设置窗口是否可见,窗口默认是不可见的. ...

最新文章

  1. 从通用到专用,5G时代IP核的新故事
  2. DenseNet 测试
  3. 修改Eclipse中项目在Apache Tomcat中的部署路径
  4. ios_UITextField右侧小圆叉
  5. 多线程中的ManualResetEvent
  6. 武汉大学提出全球最大的口罩遮挡人脸数据集(附下载地址):RMFD
  7. 更高效的利用Jupyter+pandas进行数据分析,6种常用数据格式效率对比!
  8. FLV封装格式分析器
  9. java面向字符的输入流_详细解读Java编程中面向字符的输入流
  10. java定义private_java9开始——接口中可以定义private私有方法
  11. android 页面icon拉伸_所有同学!注意咯!!设计师不可忽略的页面转场来咯!!...
  12. steam自定义信息框_如何设置和自定义Steam控制器
  13. win10如何找计算机管理员密码,win10管理员密码忘了怎么办 win10系统找回admin密码方法...
  14. python项目实战:实现游戏敏感词汇过滤器
  15. 关于系统前端开发的那些事
  16. 阿里云服务器与本地不能复制粘贴
  17. 如何确定抽样的样本数量
  18. 树上战争 HDU-2545
  19. Item 40: Use std::atomic for concurrency, volatile for special memory.
  20. 音频压缩工具——Speex的使用

热门文章

  1. JavaScript画星星
  2. 关于勒索病毒 Ransom:Win32.WannaCrypt 解决方案的最后一次说明
  3. 利用计算机模拟人脑进行演绎推理,2014年4月全国自学考试计算机应用技术试题...
  4. 会声会影2018 转码导出H.265/HEVC编码视频
  5. java word 颜色设置_Java 给Word文档添加背景颜色
  6. 在word中填充背景颜色的方法
  7. 大脑是什么样的网络?
  8. 003.原生数据类型使用陷阱 Pitfall of Primitive Data Type
  9. GetLastError()函数返回值对照列表
  10. 基于Java的vtt转txt程序