正则表达式对象的创建与使用

字符串对象



使用正则表达式最简单的办法,就是直接调用字符串对象的方法。

  • matches : 检查是否匹配上指定的正则表达式

    System.out.println("1234".matches("\\d+")); // true
  • split : 将字符串从指定的正则表达式匹配的位置拆分,另外还有一个重载的方法可以指定拆分成多少个

    String str = "Hello world 47";
    String[] arr = str.split(" ");
    System.out.println(Arrays.toString(arr)); // [Hello, world, 47]
    arr = str.split(" ", 2);
    System.out.println(Arrays.toString(arr)); // [Hello, world 47]
  • replaceFirst、replaceAll : 替换第一个、全部匹配上指定正则表达式的子串
    String str = "Hello world 47";
    System.out.println(str.replaceFirst("\\d", "*")); // Hello world *7
    System.out.println(str.replaceAll("\\d", "*")); // Hello world **

Pattern和Matcher对象的创建



由于String类的功能有限,所以我们经常需要构建功能强大的正则表达式对象。通过Pattern.compile()方法来根据传入的String类型的正则表达式生成Pattern对象,然后把需要检索的字符串传入Pattern类的matcher方法生成Matcher对象,Matcher中提供了大量的方法满足我们的需求。Matcher对象的创建过程如下

Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("123456");

其中Pattern还提供了一个重载的compile方法,第二个参数为标记参数(可以传入多个用"|"连接),这些标记都是Pattern类中的常量。如下

  • Pattern.CANON_EQ:当且仅当两个字符的完全规范分解都相同的情况下,才认定匹配。比如用了这个标志之后,表达式"a/u030A"会匹配"\u00E5"(默认不匹配)
  • Pattern.CASE_INSENSITIVE(?i)、Pattern.UNICODEC_CASE(?u):两个结合使用可以无视大小写(默认只有US-ASUII字符集是可以)
  • Pattern.COMMENTS(?x):空格与#开头的行到行末会被忽略
  • Pattern.DOTALL(?s):"."可以匹配所有字符包括换行符(默认不包括)
  • Pattern.MULTILNE(?m):多行情况下"^"和"$"分别匹配一行的开始与结尾(默认是整个字符串的开始与结尾)
  • Pattern.UNIX_LINES(?d):"."、"^"和"&"只识别换行符"\n"

以上标记参数后面的括号内的字符若直接插入在正则表达中,将拥有与传入标记参数一样的效果。如下所示

Pattern p = Pattern.compile("^java", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
//Pattern p = Pattern.compile("(?i)(?m)^java");
Matcher m = p.matcher("java is good\nJAVA is best");
while (m.find())
    System.out.print(m.group() + " "); // java JAVA

上面代码中用到Matcher对象的find与group方法将在下面进行讲解。可以看出以上两种创建Pattern对象的方式,将不会影响最后的输出结果。而且由于传入了标记参数所以可以无视大小写成功匹配JAVA并且字符串中含有换行符所以匹配到了两个结果

Matcher对象的方法以及使用


  • matches:判断整个字符串是否都匹配正则表达式
  • lookingAt:从字符串的开头判断是否匹配正则表达式但可以不用整个都匹配
  • find:像迭代器那样向前遍历字符串,查找是否有匹配字符串片段。该方法还有一个重载的方法,可以传入一个索引值,即从该索引位置起查找是否有匹配的
  • group:当没有参数时返回前一次匹配成功的字符串(匹配整个正则表达式),由于一个正则表达式可以有包含多个括号,即拥有多个组,所以该方法可以传入一个数字,来返回匹配上某个组的字符串,当传入的数字为0时与未传参一样
  • groupCount:返回该正则表达式总共有可以分成多少组

    String s = "Hello world, my name is ghaien.\n" +
            "this is a demo from a book.\n" +
            "it‘s named thinking in java.";
    Matcher m = Pattern.compile("(?m)((\\S+)\\s+(\\S+))$").matcher(s);
    while (m.find()) {
        for (int i = 0; i < m.groupCount(); i++)
            System.out.print("[" + m.group(i) + "]");
        System.out.println();
    }/* output
        [is ghaien.][is ghaien.][is]
        [a book.][a book.][a]
        [in java.][in java.][in]
    */
  • start:返回先前匹配上的字符串的起始位置的索引值
  • end:返回先前匹配上的字符串的最后位置的索引值加一
  • replaceFirst、replaceAll:将匹配上的字符串的第一个、所有替换成指定的字符串
  • appendReplacement:这个方法会对字符串进行渐进式的替换,并将替换后的字符串通过指定的StringBuffer对象拼接起来
  • appendTail:通常用来结合上一个方法来使用,当替换了多次之后可以调用这个方法将后面没有被替换的字符串复制到StringBuffer中

    String s = "Hello world 47";
    Matcher m = Pattern.compile("[a-zA-Z]").matcher(s);
    System.out.println(m.replaceFirst("*"));
    m = Pattern.compile("[a-zA-Z]").matcher(s);
    System.out.println(m.replaceAll("*"));
    m = Pattern.compile("[a-zA-Z]").matcher(s);
    StringBuffer sb = new StringBuffer();
    int i = 0;
    while (m.find())
        m.appendReplacement(sb, i++ + "");
    System.out.println(sb);
    m.appendTail(sb);
    System.out.println(sb);
    /* output
        *ello world 47
        ***** ***** 47
        01234 56789
        01234 56789 47
     */

    从上面的代码中可以看出replaceFirst与replaceAll只能将一个或所有匹配的替换成某个指定的字符串,这有时候并不能满足我们的需求,而appendReplacement方法的替换是渐进式的并且每次都能替换成我们所需要的,从后面来两个输出的结果也能够很直接的看出appendTail方法的作用

  • reset:可以将现有的Matcher对象应用于一个新的字符串
时间: 2024-07-30 09:49:44

正则表达式对象的创建与使用的相关文章

正则表达式对象

1.RegExp对象概述 RegExp对象表示正则表达式,它是对字符串执行模式匹配的强大工具 创建正则表达式对象 var rgExp=/pattern/flags; var rgExp=new RegExp("pattern",["flags"]); flags标识有以下几个: g:设定当前匹配为全局模式 i:忽略匹配中的大小写检测 m:多行搜索模式 2.RegExp对象的常用方法 RegExpObject.test(string) 如果字符串string中含有与R

笔记007:对象——RegExp正则表达式对象

1.RegExp 一个用于匹配的模式文本 用0个或多个修饰符描述的匹配模式细节 RegExp对象的创建形式 用内建构造器创建    var re = new RegExp("j.*t") 用文本定义方式  var re = /j.*t/; 2.RegExp对象属性 g==>global:相关搜索在找到第一个匹配位置时是否停止(false默认) i==>ignoreCase:是否忽略大小写 (false默认) m==>multiline:设置是否跨行搜索的选项,默认为f

JavaScript日期时间对象的创建与使用(三)

时钟效果一: 代码: <html> <head> <meta charset="utf-8"/> <title>JavaScript日期时间对象的创建与使用</title> </head> <body> <h2 id="time"></h2> <script type="text/javascript"> function Cl

ajax之请求对象的创建以及它与服务器之间的4次“握手”(好吧其实只有3次)

request对象的创建 对于request对象的创建,我们总会第一时间反映到下列语句 var request=new XMLHttpRequest(); 不过因为各大浏览器之间的相互斗殴行为,事情是不会这么简单的. 比如非常经典的:IE浏览器没有XMLHttpRequest函数. 但这难不倒我们聪明机智的程序员,我们也有经典的应对措施: function createRequest(){     try{         request=new XMLHttpRequest();     }c

对象的创建

创建一个类,实际上是定义了一种新的复合数据类型.声明该类的一个变量,就是声明该类的对象过程.创建对象包括对象的声明和实例化两步. 1.对象的声明 对象的声明主要是声明该对象是哪个类的对象,语法如下: 类名 变量名列表: 注:变量名列表可包含一个对象名或多个对象名,如果含有多个对象名,对象名之间采用逗号分隔开.当声明一个对象时,就为该对象名在栈内存中分配内存空间,此时它的值为null ,表示不指向任何对象. 2.对象的创建 在声明对象时,并没有为该对象在堆内存中分配空间,只有通过new 操作才能完

Javascript我学之五对象的创建与使用

本文是金旭亮老师网易云课堂的课程笔记,记录下来,以供备忘. 对象的创建 JavaScript对象有两种类型 1).Native:在ECMAScript标准中定义和描述,包括JavaScript内置对象(数组,日期对象等)和用户自定义对象. 2).Host:在主机环境(如浏览器)中实现并提供给开发者使用,比如windows对象和所有的DOM对象 对象的含义 Object is an unordered collection of properties each of which contains

JVM学习:对象的创建和内存分配

1.对象的创建 java是面向对象的语言,因此对象的创建无时无刻都存在.在语言层面,使用new关键字即可创建出一个对象.但是在虚拟机中,对象创建的创建过程则是比较复杂的. 首先,虚拟机运到new指令时,会去常量池检查是否存在new指令中包含的参数,比如new People(),则虚拟机首先会去常量池中检查是否有People这个类的符号引用,并且检查这个类是否已经被加载了,如果没有则会执行类加载过程. 在类加载检查过后,接下来为对象分配内存当然是在java堆中分配,并且对象所需要分配的多大内存在类

图解java对象的创建过程

前面几篇博文分别介绍了JAVA的Class文件格式.JVM的类加载机制和JVM的内存模型,这里就索性把java对象的创建过程一并说完,这样java对象的整个创建过程就基本上说明白了(当然你要有基础才能真正看明白).经常有人问我为什么这么喜欢钻研底层的东西,首先,因为我以前的做硬件的和嵌入式的,兴趣使然:其次,我个人感觉,如果不把上下打通,心里老是有一堵墙过不去,说白了,这是个人因素,与好坏无关(当然,经常有人说,懂底层原理是成为高手的必经之路). 现在来说一下我当初学习JVM的原因,在学习JAV

.NET对象的创建、垃圾回收、非托管资源的手动处理

本篇用来梳理对象的创建.垃圾的回收,以及非托管资源的手动处理. →首先运行应用程序,创建一个Windows进程. →CLR创建一块连续的虚拟地址空间,这个地址空间就是托管堆.而且,这个地址空间最初并没有对应的物理存储空间. 虚拟地址空间分成2段.一个区段是普通堆,也叫GC堆,大小小于85000字节的引用类型对象的实例被分配在这里:另一个是大对象堆,大小大于等于85000字节的引用类型对象的实例被分配在这里. 对于客户端应用程序,每个区段的大小大致是16MB:对于服务端应用程序,每个区段的大小大致