Java正则表达式
正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑和处理文本。
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
正则表达式实例
一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配“Hello World”字符串。
.(点号)也是一个正则表达式,他匹配任何一个字符如:“a“或者”1“。
Java正则表达式和Perl的是最为相似的。
java.util.regex包主要包括以下三个类:
- Pattern类:pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法。要创建一个Pattern对象,你必须首先调用其公共静态编译方法,它返回一个Pattern对象。该方法接收一个正则表达式作为它的第一个参数。
- Matcher类:Matcher对象是对输入字符串进行解释和匹配操作的引擎。与Pattern类一样,Matcher也没有公共构造方法。你需要调用Pattern对象的Matcher方法来获得一个Matcher对象。
- PatternSyntaxException类:PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
以下实例中使用了正则表达式 .*chinasouthtiger.* 用于查找字符串中是否包含了 chinasouthtiger 子串:
import java.util.regex.*; class RegexExample{ public static void main(String []args){ String content="I am noob "+"from chinasouthtiger.com"; String pattern=".*chinasouthtiger.*"; Boolean isMathch=Pattern.matches(pattern,content); System.out.println("字符串中是否包含了 ‘chinasouthtiger’字符子串?”+isMathch); } }
捕获组
捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。
例如,正则表达式 (dog) 创建了单一分组,组里包含"d","o",和"g"。
捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:
- ((A)(B(C)))
- (A)
- (B(C))
- (C)
可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。
还有一个特殊的组(group(0)),它总是代表整个表达式。该组不包括在 groupCount 的返回值中。
实例
下面的例子说明如何从一个给定的字符串中找到数字串:
package pkg2020华南虎; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * * @author yl */ public class RegexMatches { public static void main(String[] args) { //按指定模式在字符串查找、 String line = "This order was placed for QT3000! OK?"; String pattern = "(\D*)(\d+)(.*)"; //创建patteern对象 Pattern r = Pattern.compile(pattern); //现在创建matcher对象 Matcher m = r.matcher(line); if (m.find()) { System.out.println("Found value:" + m.group(0)); System.out.println("Found value:" + m.group(1)); System.out.println("Found value:" + m.group(2)); System.out.println("Found value:" + m.group(3)); }else{ System.out.println("NO MATCH"); } } }
正则表达式语法
在其他语言中,\ 表示:我想要在正则表达式中插入一个普通的(字面意义)反斜杠。
在Java中,\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
所以,,在其他语言中(如Perl),一个反斜杠 就足以具有转义的作用,而在Java正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在Java的正则表达式中,两个 \ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \d,而表示一个普通的反斜杠是 \\ 。
根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "" 与单个退格字符匹配,而 "\b" 与单词边界匹配。字符串字面值 "(hello)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 "\(hello\)"。