什么是正则表达式? java
正则表达式就是人为的定义一些规则,但愿计算机按照咱们制定的规则执行。正则表达式主要用于操做字符串 正则表达式
java.util.regex包主要包括如下三个类: app
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是一个非强制异常类,它表示一个正则表达式模式中的语法错误。 函数
正则表达式的语法 ui
字符类 | |
---|---|
[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 次 |
注意:这里只列出了经常使用的一些语法,具体信息查看文档 搜索引擎
补充: spa
一、Pattern类的方法摘要 code
方法摘要 | |
---|---|
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() 返回此模式的字符串表示形式。 |
二、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(); 一、首先按面向对象的思惟,把正则表达式封装成类Pattern,可是该类没有构造函数,只能经过他的静态方法获取该类的实例 二、经过正则兑现获取匹配器,由于匹配器须要依靠正则表达式和字符串,因此说须要把字符串做为参数传递给匹配器对策方法 三、经过匹配器的相应方法完成想要的操做 */ 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