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

import java.util.regex.Matcher;
import java.util.regex.Pattern;
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 ());//true
    print (m.group ());//123
    print (m.start ()+"-"+m.end ());//0-3: 1~-
    System.out.printf("换行--------------------\n");
    print (m.find ());//true
    print (m.group ());//45678
    print (m.start ()+"-"+m.end ());//4-9: 4~1
    System.out.printf("换行--------------------\n");
    print (m.find ());//true
    print (m.group ());//910
    print (m.start ()+"-"+m.end ());//12-15:9~-
    System.out.printf("换行--------------------\n");
    print (m.find ());//false
    System.out.printf("换行--------------------\n");
    System.out.println ();

    print (m.matches ());//false
    System.out.printf("换行\n");
    //m.reset ();
    print (m.find ());//true
    print (m.group ());//45678
    print (m.start ()+"-"+m.end ());//4-9
    System.out.printf("换行\n");
    print (m.find ());//true
    print (m.group ());//910
    print (m.start ()+"-"+m.end ());//12-15
    System.out.printf("换行\n");
    print (m.find ());//false
    System.out.printf("换行\n");
    print (m.find ());//false
    System.out.printf("换行\n");
    System.out.println ();

    print (m.matches ());//false
    System.out.printf("换行\n");
    m.reset ();
    print (m.find ());//true
    print (m.group ());//123
    print (m.start ()+"-"+m.end ());//0-3
    System.out.printf("换行\n");
    print (m.find ());//true
    print (m.group ());//45678
    print (m.start ()+"-"+m.end ());//4-9
    System.out.printf("换行\n");
    print (m.find ());//true
    print (m.group ());//910
    print (m.start ()+"-"+m.end ());//12-15
    System.out.printf("换行\n");
    print (m.find ());//false
    System.out.printf("换行\n");
    System.out.println ();

    print (m.lookingAt ());//true
    print (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 方法获取更多信息。
*/

时间: 2024-11-09 01:01:28

Java 正则表达式里find()方法的使用的相关文章

java正则表达式总结

最近用到的正则表达式 由于最近在做一个android的新闻客户端,多次用到了正则表达式,因此总结下. 1.使用正则表达式获取Rss资源内的文章内容的图片url 因为在每条新闻浏览的listView里需要新闻内容里的图片,因此你需要抓取文章第一张照片url地址,豆瓣的照片格式是: <img src="http://theimg.aliapp.com/img.php?url=http://img6.douban.com/view/presto/large/public/218991.jpg&q

Java正则表达式匹配多行

默认情况下.*中的.只能匹配出\n以外的字符,如果遇到要匹配的字符串包含回车换行符(多行),则正则表达式遇到换行符后会停止,导致包含回车换行符的串不能正确匹配,解决的办法是: 1.使用Pattern和Matcher对象 设置Pattern模式为:Pattern.DOTALL 2.使用String.replaceAll() 正则表达式写法: String reg = "(?s)'.*'"; 下面是一个包含回车换行字符的正则表达式替换处理例子. static String teststr

Java 正则表达式功能及应用

正则表达式,就是用某种模式去匹配一类字符串的一个公式,正则表达式由一些普通字符和一些元字符(metacharacters)组成.普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,不管是.Net平台还是Java平台,正则表达式表达的意思都是一样的,下面我们主要分析Java正则表达式中的功能和具体应用,希望文章对您有所帮助,仅供参考. 自从jdk1.4推出java.util.regex包,就为我们提供了很好的Java正则表达式应用平台,因为Java正则表达式是一个很庞杂的体系. \\ 反斜杠

java正则表达式方法介绍

一.java正则表达式表: 字符 说明 \ 将下一字符标记为特殊字符.文本.反向引用或八进制转义符.例如,"n"匹配字符"n"."\n"匹配换行符.序列"\\"匹配"\","\("匹配"(". ^ 匹配输入字符串开始的位置.如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配.

Java正则表达式教程及示例

本文由 ImportNew - ImportNew读者 翻译自 journaldev.欢迎加入翻译小组.转载请见文末要求. [感谢 @CuGBabyBeaR  的热心翻译.如果其他朋友也有不错的原创或译文,可以尝试投递到 ImportNew.] 当我开始我的Java职业生涯的时候,对于我来说正则表达式简直是个是梦魇.本教程旨在帮助你驾驭Java正则表达式,同时也帮助我复习正则表达式. 什么是正则表达式? 正则表达式定义了字符串的模式.正则表达式可以用来搜索.编辑或处理文本.正则表达式并不仅限于某

JAVA 正则表达式 (超详细)

(PS:这篇文章为转载,我不喜欢转载的但我觉得这篇文章实在是超赞了,就转了过来,这篇可以说是学习JAVA正则表达的必读篇.作者是个正真有功力的人,阅读愉快) 在Sun的JavaJDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu x用户都会遇到正则表达式.正则表达式是个极端强大工具,而且在字符串模式-匹配和字符串模式-替换方面富有弹性.在Unix世界里,正则表达式几乎没有

Java 正则表达式(精华)

英文:Jakob Jenkov译文:严亮链接:ifeve.com/java-regex/ Java 提供了功能强大的正则表达式API,在java.util.regex 包下.本教程介绍如何使用正则表达式API. 正则表达式 一个正则表达式是一个用于文本搜索的文本模式.换句话说,在文本中搜索出现的模式.例如,你可以用正则表达式搜索网页中的邮箱地址或超链接. 正则表达式示例 下面是一个简单的Java正则表达式的例子,用于在文本中搜索 http:// String text = "This is th

java正则表达式

在做 Crawler的时候,本来是准备用正则的,但是看jsoup很好用,就没有学,刚刚在做古诗提取的时候,又要用到正则表达式,还是学了算了. 说明: 文章重点参考的http://www.cnblogs.com/ggjucheng/p/3423731.html,加上自己有一点理解. 正则表达式的语法可以参考: http://www.runoob.com/regexp/regexp-syntax.html java正则表达式主要是关于java.util.regex中的两个类: 1.Pattern:正

Java正则表达式实例详解

创建正则表达式 你可以从比较简单的东西入手学习正则表达式.要想全面地掌握怎样构建正则表达式,可以去看JDK 文档的java.util.regex 的Pattern 类的文档. 字符 B 字符B \xhh 16进制值0xhh 所表示的字符 \uhhhh 16进制值0xhhhh 所表示的Unicode字符 \t Tab \n 换行符 \r 回车符 \f 换页符 \e Escape 正则表达式的强大体现在它能定义字符集(character class).下面是一些最常见的字符集及其定义的方式,此外还有