Java中的正则表达式Pattern与Matcher
一般来说比起功能有限的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的更多相关文章
- JAVA中的正则表达式--待续
1.关于“\”,在JAVA中的正则表达式中的不同: 在其他语言中"\\"表示为:我想要在正则表达式中插入一个普通的反斜杠: 在Java中“\\”表示为:我想要插入一个正则表达式反斜 ...
- java中使用正则表达式匹配字符串
在Java中使用正则表达式去匹配相应的字符串: String importFileRole = "(import)\\s*[a-zA-Z0-9_<>.]+\\;";// ...
- 【java 正则表达式】记录所有在java中使用正则表达式的情况
本篇记录在java中邂逅正则表达式的所有美丽瞬间.因为在java和js中正则表达式的语法并不一致. 1.匹配字符串中有出现[2.1开头或者&2.1或者&3.1等的] Pattern m ...
- 译:Java 中的正则表达式性能概述
原文链接:https://www.baeldung.com/java-regex-performance 作者: baeldung 译者:Darren Luo 1. 概述 在本快速教程中,我们将展示模 ...
- 9.JAVA中的正则表达式
一.JAVA中的正则表达式 1.概念:以某种特定的方式描述字符串 1.Java中正则表达式的规则 ? #{0,1}-?有一个-或者没有 \\ #表示一个" ...
- (转)Java中使用正则表达式的一个简单例子及常用正则分享
转自:http://www.jb51.net/article/67724.htm 这篇文章主要介绍了Java中使用正则表达式的一个简单例子及常用正则分享,本文用一个验证Email的例子讲解JAVA中如 ...
- java正则表达式Pattern和Matcher
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...
- JAVA正则表达式 Pattern和Matcher
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包. ...
- JAVA正则表达式 Pattern和Matcher(转)
1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包.它包括两个类:Pattern和Matcher. 首先一个Pattern实例订制了一 ...
随机推荐
- Spark Sort-Based Shuffle具体实现内幕和源码详解
为什么讲解Sorted-Based shuffle?2方面的原因:一,可能有些朋友看到Sorted-Based Shuffle的时候,会有一个误解,认为Spark基于Sorted-Based Shuf ...
- [LeetCode] 225. Implement Stack using Queues_Easy tag: Design
Implement the following operations of a stack using queues. push(x) -- Push element x onto stack. po ...
- php 非递归实现分类树
本文实例讲述了php通过前序遍历树实现无需递归的无限极分类.分享给大家供大家参考.具体如下: 大家通常都是使用递归实现无限极分类都知道递归效率很低,下面介绍一种改进的前序遍历树算法,不适用递归实现无限 ...
- js时钟
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- strus2 框架介绍
strus2 执行过程: ActionMapper会去找ActionMapping查找URL请求的映射 1:ActionMapping这个类用name+namespace确定请求的映射, (但是仍然不 ...
- discuz注册页修改
大家好!近来备受发帖机困扰,备受垃圾帖子困扰.一直以来都纯粹在删帖当中,本来网站服务器就是国内服务器,这样一来很多关键字是禁止的,可不管如何设置防灌水还是无法杜绝这一事项,特别是国内空间的网站,一出现 ...
- yii2之创建管理员
第一步,使用迁移文件建表admin 先建立数据迁移文件: 小贴士,如果发现自己改错了,需要重新修改迁移文件 第二步,使用gii工具创建model 创建一个新的model,继承AdminAR,方便以后管 ...
- MySQL从删库到跑路(四)——MySQL数据库创建实例
作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.创建数据库 1.创建数据库 创建数据库,指定数据库的默认字符集为utf8.create database sch ...
- tomcat 的最大连接数设置
前提说明为了确保服务不会被过多的http长连接压垮,我们需要对tomcat设定个最大连接数,超过这个连接数的请求会拒绝,让其负载到其它机器.达到保护自己的同时起到连接数负载均衡的作用. 动手去做一开始 ...
- Java求解迷宫问题:栈与回溯算法
摘要: 使用栈的数据结构及相应的回溯算法实现迷宫创建及求解,带点JavaGUI 的基础知识. 难度: 中级 迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1) 选择一个 ...