什么是正则表达式?
正则表达式就是人为的定义一些规则,希望计算机按照我们制定的规则执行。正则表达式主要用于操作字符串
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()); } }}
输出结果:
lailin