Java编程之正则表达式

什么是正则表达式?

正则表达式就是人为的定义一些规则,希望计算机按照我们制定的规则执行。正则表达式主要用于操作字符串

java.util.regex包主要包括以下三个类:

  • Pattern类:
  • Matcher类:
  • PatternSyntaxException:

Pattern类:
Pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法。要创建一个Pattern对象,你必须首先调用其公共静态编译方法(Pattern p = Pattern.compile("a*b")),它返回一个Pattern对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher类:
Matcher对象是对输入字符串进行解释和匹配操作的引擎。与Pattern类一样,Matcher也没有公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象(Matcher m = p.matcher("aaaaab"))。
PatternSyntaxException:
PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

正则表达式的语法

字符类
[abc] a、b或c(简单类)
[^abc] 任何字符,除了a、b或c(否定)
[a-zA-Z] a到z或A到Z,两头的字母包括在内(范围)
[a-d[m-p]] a到d或m到p:[a-dm-p](并集)
[a-z&&[def]] d、e或f(交集)
[a-z&&[^bc]] a到z,除了b和c:[ad-z](减去)
[a-z&&[^m-p]] a到z,而非m到p:[a-lq-z](减去)

预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字:[^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

 

边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾

Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n
X{n,} X,至少 n
X{n,m} X,至少 n 次,但是不超过 m

注意:这里只列出了常用的一些语法,具体信息查看文档

补充:

1、Pattern类的方法摘要

方法摘要
static Pattern compile(String regex)
将给定的正则表达式编译到模式中。
static Pattern compile(String regex, int flags)
将给定的正则表达式编译到具有给定标志的模式中。
int flags()
返回此模式的匹配标志。
Matcher matcher(CharSequence input)
创建匹配给定输入与此模式的匹配器。
static boolean matches(String regex, CharSequence input)
编译给定正则表达式并尝试将给定输入与其匹配。
String pattern()
返回在其中编译过此模式的正则表达式。
static String quote(String s)
返回指定String的字面值模式String。
String[] split(CharSequence input)
围绕此模式的匹配拆分给定输入序列。
String[] split(CharSequence input, int limit)
围绕此模式的匹配拆分给定输入序列。
String toString()
返回此模式的字符串表示形式。

2、Matcher类的方法摘要

方法摘要
Matcher appendReplacement(StringBuffer sb, String replacement)
实现非终端添加和替换步骤。
StringBuffer appendTail(StringBuffer sb)
实现终端添加和替换步骤。
int end()
返回最后匹配字符之后的偏移量。
int end(int group)
返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。
boolean find()
尝试查找与该模式匹配的输入序列的下一个子序列。
boolean find(int start)
重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
String group()
返回由以前匹配操作所匹配的输入子序列。
String group(int group)
返回在以前匹配操作期间由给定组捕获的输入子序列。
int groupCount()
返回此匹配器模式中的捕获组数。
boolean hasAnchoringBounds()
查询此匹配器区域界限的定位。
boolean hasTransparentBounds()
查询此匹配器区域边界的透明度。
boolean hitEnd()
如果匹配器执行的最后匹配操作中搜索引擎遇到输入结尾,则返回 true。
boolean lookingAt()
尝试将从区域开头开始的输入序列与该模式匹配。
boolean matches()
尝试将整个区域与模式匹配。
Pattern pattern()
返回由此匹配器解释的模式。
static String quoteReplacement(String s)
返回指定String的字面值替换String。
Matcher region(int start, int end)
设置此匹配器的区域限制。
int regionEnd()
报告此匹配器区域的结束索引(不包括)。
int regionStart()
报告此匹配器区域的开始索引。
String replaceAll(String replacement)
替换模式与给定替换字符串相匹配的输入序列的每个子序列。
String replaceFirst(String replacement)
替换模式与给定替换字符串匹配的输入序列的第一个子序列。
boolean requireEnd()
如果很多输入都可以将正匹配更改为负匹配,则返回 true。
Matcher reset()
重置匹配器。
Matcher reset(CharSequence input)
重置此具有新输入序列的匹配器。
int start()
返回以前匹配的初始索引。
int start(int group)
返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引。
MatchResult toMatchResult()
作为 MatchResult 返回此匹配器的匹配状态。
String toString()
返回匹配器的字符串表示形式。
Matcher useAnchoringBounds(boolean b)
设置匹配器区域界限的定位。
Matcher usePattern(Pattern newPattern)
更改此Matcher用于查找匹配项的Pattern。
Matcher useTransparentBounds(boolean b)
设置此匹配器区域边界的透明度。

案例:

package cc.enfp.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PatternTest
{
    /*
            正则获取
    Pattern p = Pattern.compile("a*b");
    Matcher m = p.matcher("aaaaab");
    boolean b = m.matches();
    
    1、首先按面向对象的思维,把正则表达式封装成类Pattern,但是该类没有构造函数,只能通过他的静态方法获取该类的实例
    2、通过正则兑现获取匹配器,因为匹配器需要依靠正则表达式和字符串,所以说需要把字符串作为参数传递给匹配器对策方法
    3、通过匹配器的相应方法完成想要的操作
    */
    public static void main(String[] args)
    {
	String str = "huan ying lai guang lin";
	/**
	 * 查找出三个字母组成的单词
	 * 注意这里使用了转义字符'\\'表示'\'
	 */
	Pattern p = Pattern.compile("\\b[a-z]{3}\\b");
	Matcher m = p.matcher(str);
	while(m.find())
	{
	    System.out.println(m.group());
	}
    }
}


输出结果:
lai
lin

 

转载于:https://my.oschina.net/enfp/blog/652692

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值