一般来说比起功能有限的String类,我们更愿意构造功能强大的正则表达式。我们可以通过Pattern 与 Matcher 来构建功能强大的正则表达式

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class Main {
//public static String s = "I am a good student... haha good"; public static void main(String[] args) throws FileNotFoundException {
Scanner input = new Scanner(new File("data.in"));
Pattern tp = Pattern.compile(" ");
System.out.println(Arrays.asList(tp.split("a b c"))); String s = "abcabcabcdefabc"; List<String> s1 = new ArrayList<String>();
s1.add("abcabcabcdefabc"); s1.add("abc");
s1.add("(abc)+"); s1.add("(abc){2,}"); for (String s2 : s1) {
System.out.println("正则:" + s2);
Pattern p = Pattern.compile(s2); //编译自己的正则返回Pattern对象 ,Pattern对象表示编译后的正则表达式
Matcher m = p.matcher(s); //传入要检索的字符串,返回Matcher对象
while (m.find()) {
System.out.println("Match : " + m.group() + " " + m.start() + " " + m.end());
}
} /*
* Pattern对象还提供了matches方法返回是否匹配整个字符串
* split分割方法
*
* Matcher 提供方法:
* matches用来判断整个输入字符串是否匹配正则表达式
* lookingAt则用来判断该字符串的始部是否能够匹配模式
* find 遍历输入字符串
* */ }
} 输出:
[a, b, c]
正则:abcabcabcdefabc
Match : abcabcabcdefabc 0 15
正则:abc
Match : abc 0 3
Match : abc 3 6
Match : abc 6 9
Match : abc 12 15
正则:(abc)+
Match : abcabcabc 0 9
Match : abc 12 15
正则:(abc){2,}
Match : abcabcabc 0 9

  

组:  关于组的操作

组号为0表示表示整个表达式, 组号为1表示第一对括号

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class Main {
public static String s = "I am a good student\n" +
"fhhj hhh nnnn oj\n" +
"very am you can\n" ; public static void main(String[] args) throws FileNotFoundException {
Matcher m = Pattern.compile("(?m)(\\S+)\\s+((\\S+)\\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();
}
}
}

  

Pattern的split分割:

public class Main {
public static String s = "I am a good student"; public static void main(String[] args) throws FileNotFoundException {
System.out.println( Arrays.asList(Pattern.compile(" ").split(s)));
}
}

  

替换操作:

import java.io.File;
import java.io.FileNotFoundException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class Main {
public static String s = "/*! here's a block of text to use as input to" +
"the ruguler expresssion mavherer . note that we'll"+
"extracted block.!*/"; public static void main(String[] args) throws FileNotFoundException {
Matcher m = Pattern.compile("/\\*!(.*)!\\*/").matcher(s);
String ans = null;
while (m.find()) {
ans = m.group(1);
}
System.out.println("去掉注释符之后:" + ans);
ans = ans.replaceAll(" {2,}", " ");
System.out.println("去掉多余空格之后:" + ans);
ans = ans.replaceAll("(?m)^ +", "");
System.out.println("去掉前边的空格之后:" + ans);
String tmp = ans.replaceAll("[aeiou]", "HAHA");
System.out.println("替换之后:" + tmp); StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile("[aeiou]");
Matcher tm = p.matcher(ans);
while (tm.find()) {
/*
* 首先把要发生替换的部分到字符串开始的地方都复制给sb
* 这里我们能够更加灵活的对发生替换的部分进行处理,我们这里的处理是转化成大写字母
*/
tm.appendReplacement(sb, tm.group().toUpperCase());
//System.out.println("SB = " + sb); 可以自己输出看一看
}
tm.appendTail(sb); //把末尾的部分加上
System.out.println("替换之后:" + sb); }
} 输出:
去掉注释符之后: here's a block of text to use as input tothe ruguler expresssion mavherer . note that we'llextracted block.
去掉多余空格之后: here's a block of text to use as input tothe ruguler expresssion mavherer . note that we'llextracted block.
去掉前边的空格之后:here's a block of text to use as input tothe ruguler expresssion mavherer . note that we'llextracted block.
替换之后:hHAHArHAHA's HAHA blHAHAck HAHAf tHAHAxt tHAHA HAHAsHAHA HAHAs HAHAnpHAHAt tHAHAthHAHA rHAHAgHAHAlHAHAr HAHAxprHAHAsssHAHAHAHAn mHAHAvhHAHArHAHAr . nHAHAtHAHA thHAHAt wHAHA'llHAHAxtrHAHActHAHAd blHAHAck.
替换之后:hErE's A blOck Of tExt tO UsE As InpUt tOthE rUgUlEr ExprEsssIOn mAvhErEr . nOtE thAt wE'llExtrActEd blOck.

  

我们可以用reset,将现有的Matcher对象应用于一个新的字符序列

public class Main {

	public static void main(String[] args) throws FileNotFoundException {
List<String> list = new ArrayList<String>();
list.add("string"); list.add("Scdvffv njnjn");
list.add("test grgrg"); list.add("common gfgrg"); Pattern p = Pattern.compile("^[Ssct]\\w+");
Matcher m = p.matcher("");
for (String s : list) {
m.reset(s);
while (m.find()) {
//首先输出匹配字符串, 查看开始部分是否满足, 查看整个字符串是否满足
System.out.println(m.group() + " " + m.lookingAt() +" " + m.matches());
}
} }
}
输出:

string true true
Scdvffv true false
test true false
common true false

  

Java中的正则表达式Pattern与Matcher的更多相关文章

  1. JAVA中的正则表达式--待续

    1.关于“\”,在JAVA中的正则表达式中的不同: 在其他语言中"\\"表示为:我想要在正则表达式中插入一个普通的反斜杠: 在Java中“\\”表示为:我想要插入一个正则表达式反斜 ...

  2. java中使用正则表达式匹配字符串

    在Java中使用正则表达式去匹配相应的字符串: String importFileRole = "(import)\\s*[a-zA-Z0-9_<>.]+\\;";// ...

  3. 【java 正则表达式】记录所有在java中使用正则表达式的情况

    本篇记录在java中邂逅正则表达式的所有美丽瞬间.因为在java和js中正则表达式的语法并不一致. 1.匹配字符串中有出现[2.1开头或者&2.1或者&3.1等的] Pattern m ...

  4. 译:Java 中的正则表达式性能概述

    原文链接:https://www.baeldung.com/java-regex-performance 作者: baeldung 译者:Darren Luo 1. 概述 在本快速教程中,我们将展示模 ...

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

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

  6. (转)Java中使用正则表达式的一个简单例子及常用正则分享

    转自:http://www.jb51.net/article/67724.htm 这篇文章主要介绍了Java中使用正则表达式的一个简单例子及常用正则分享,本文用一个验证Email的例子讲解JAVA中如 ...

  7. java正则表达式Pattern和Matcher

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...

  8. JAVA正则表达式 Pattern和Matcher

    java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介:  java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...

  9. JAVA正则表达式 Pattern和Matcher(转)

    1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher.        首先一个Pattern实例订制了一 ...

随机推荐

  1. Ubuntu16.04安裝最新Nvidia驱动

    在安装完Ubuntu之后,可能通过自带驱动无法更新,一直处于无法下载状态,那么就需要通过到Nvidia官网下载驱动,手动安装了 方法/步骤 通过度娘,打开NVIDIA官网,然后在下载驱动那里找到自己的 ...

  2. [LeetCode] 258. Add Digits_Easy tag: Math

    Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. ...

  3. Pandas之Dropna滤除缺失数据

    import pandas as pd import numpy as np from numpy import nan as NaN 一.处理Series对象 通过dropna()滤除缺失数据 fr ...

  4. 7.7 Models -- Working with Records

    Modifying Attributes 1. 一旦一条record被加载,你可以开始改变它的属性.在Ember.js对象中属性的行为就像正常的属性.作出改变就像设置你想要改变的属性一样简单: var ...

  5. sql server中批量插入与更新两种解决方案分享(存储过程)

    转自http://www.shangxueba.com/jingyan/1940447.html 1.游标方式 SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONG ...

  6. zw版【转发·台湾nvp系列Delphi例程】HALCON AngleLl

    zw版[转发·台湾nvp系列Delphi例程]HALCON AngleLl procedure TForm1.Button1Click(Sender: TObject);var Row1, Row2 ...

  7. sql性能优化(摘自网络)

    索引,索引!!!为经常查询的字段建索引!! 但也不能过多地建索引.insert和delete等改变表记录的操作会导致索引重排,增加数据库负担. 优化目标 1.减少 IO 次数 IO永远是数据库最容易瓶 ...

  8. Ignite内存数据库与sql支持

    Ignite采用h2作为内存数据库,支持h2的一切sql语法.如果是本地缓存或者复制缓存,sql执行直接在本地h2数据库中执行,如果是分区缓存,ignite则会分解sql到多个h2数据库执行后再汇总. ...

  9. Hive 中Join的专题---Join详解

    1.什么是等值连接? 2.hive转换多表join时,如果每个表在join字句中,使用的都是同一个列,该如何处理? 3.LEFT,RIGHT,FULL OUTER连接的作用是什么? 4.LEFT或RI ...

  10. Linux服务器---安装bind

    安装bind 1.安装bind软件,需要安装3 个bind.bind-chroot.bind-util [root@localhost pub]# yum install -y bind bind-c ...