一般来说比起功能有限的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. SVN: is scheduled for addition, but is missing

    删除文件夹后点commit提交,但是报错,报错内容如下:提示 "svn: Commit failed (details follow): svn: '/***/xxx.c' is sched ...

  2. POJ:3083 Children of the Candy Corn(bfs+dfs)

    http://poj.org/problem?id=3083 Description The cornfield maze is a popular Halloween treat. Visitors ...

  3. 字母统计-map

    题目描述 输入一行字符串,计算其中A-Z大写字母出现的次数 输入描述: 案例可能有多组,每个案例输入为一行字符串. 输出描述: 对每个案例按A-Z的顺序输出其中大写字母出现的次数. 示例1 输入 复制 ...

  4. Twitter OA prepare: Anagram is A Palindrome

    Algorithm: Count the number of occurrence of each character. Only one character with odd occurrence ...

  5. React组件,React和生命周期

    笔记,具体可以看看这个博客: https://segmentfault.com/a/1190000004168886?utm_source=tag-newest react 的jsx document ...

  6. 80. Remove Duplicates from Sorted Array II(双指针)

    Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twic ...

  7. select,radio,checkbox兼容性

  8. Understanding Convolutional Neural Networks for NLP

    When we hear about Convolutional Neural Network (CNNs), we typically think of Computer Vision. CNNs ...

  9. 公司里面用的iTextSharp(教程)---关于PDF的属性设置

    下面介绍下怎么添加属性,代码如下: protected void Button1_Click(object sender, EventArgs e) {   Document doc = new Do ...

  10. Kafka基本操作

    cd kafka_2.11-0.11.0.1 bin/zookeeper-server-start.sh config/zookeeper.properties bin/kafka-server-st ...