一般来说比起功能有限的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. BGD-py实现学习【1】[转载]

    转自:https://github.com/icrtiou/Coursera-ML-AndrewNg 1.源码-对数据读取 import numpy as np import pandas as pd ...

  2. Locust性能测试5-参数化批量注册

    前言 实现场景:所有并发虚拟用户共享同一份测试数据,并且保证虚拟用户使用的数据不重复. 例如,模拟10用户并发注册账号,总共有100个手机号,要求注册账号不重复,注册完毕后结束测试 准备数据 虚拟用户 ...

  3. SpringMyBatisDay01

    1.Spring简介 Spring是一个开源轻量级应用开发框架,其目的是用于简化企业级应用程序的开发,降低侵入性Spring提供IOC和AOP功能,可以将组件(就是类)之间的耦合度降至最低,解耦,便于 ...

  4. 多项式函数插值:全域多项式插值(一)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]

    全域多项式插值指的是在整个插值区域内形成一个多项式函数作为插值函数.关于多项式插值的基本知识,见“计算基本理论”. 在单项式基插值和牛顿插值形成的表达式中,求该表达式在某一点处的值使用的Horner嵌 ...

  5. C# Bulk Operations(转)

    转自http://blog.csdn.net/winnyrain/article/details/51240684 Overcome SqlBulkCopy Limitations with C# B ...

  6. 023-centos6.5上安装使用xtrabackup

    第一步:下载.这个就看你选择什么样的安装方式了,有二进制安装,有源码包安装,有在线的rpm安装.我选择二进制安装方式,所以下载时选择linux-Generic.下载后用rz命令在xshell上上传到l ...

  7. 终端FQ

    前言我一直以为全局FQ就是所有的都能够自由访问,没想到终端有时候却不行,这里终端一般指的是window的cmd和mac的Terminal.终端一般程序员用的比较多,下载第三方依赖啊,都需要,所以我总结 ...

  8. python webdriver 测试框架-行为驱动例子

    安装行为驱动模块lettuce(卷心菜)模块 pip install lettuce Successfully installed argparse-1.4.0 colorama-0.3.9 extr ...

  9. Linux服务器---apache配置文件

    Apache配置文件 Apache的配置文件默认路径是“/etc/httpd/conf/httpd.conf”,编辑该文件就可以修改Apache的配置 1.设置网页主目录,参数DocumentRoot ...

  10. Gatling新一代压力测试工具,新一代服务器性能测试工具Gatling

    Gatling新一代压力测试工具新一代服务器性能测试工具Gatlinghttp://www.infoq.com/cn/articles/new-generation-server-testing-to ...