正则表达式底层实现
未分组
java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegularTheory {
public static void main(String[] args) {
String content="sdfjdskljldfghd1111fkasldfjksld34454glsdk;fjgkl;sdjg444jfgdkl;jg;555lkgj;asdgjf222ekgklsdfjgkl;jdfioertunvklasd;hfgjwehpotojriweop0239fdklhgjklsdp43029nkfsdnvj;333klfdjslafj859cklvjl;ds332dklsvhjn;kldfnvklas";
String regStr="\\d\\d\\d";
//2.创建模式对象[即正则表达式对象]
Pattern pattern=Pattern.compile(regStr);
//3.创建匹配器。按照正则表达式规则匹配content对象
Matcher matcher=pattern.matcher(content);
//4.开始匹配
/**
* matcher.find()
* 1.根据指定的规则,定位满足规则的 子字符串
* 2.找到后将 子字符串的开始的索引记录到matcher对象的属性 int[] groups;
* groups[0]=0,把该字符串的结束 索引+1的值记录到groups[1]=4
* 3.同时记录oldLast的值为 子字符串的结束的 索引+1的值即4,即下次执行find时,就从4开始匹配
* 根据groups[0]和groups[1]的记录的位置,从content开始截取子字符串。
*/
while(matcher.find()){
System.out.println("找到:"+matcher.group(0));
}
}
}
分组
java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegularTheory {
public static void main(String[] args) {
String content="1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台(简称为Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器。Java 2平台的发布,是Java发展过程中最重要的一个里程碑,标志着Java的应用开始普及.";
String regStr="(\\d\\d)(\\d\\d)";
//2.创建模式对象[即正则表达式对象]
Pattern pattern=Pattern.compile(regStr);
//3.创建匹配器。按照正则表达式规则匹配content对象
Matcher matcher=pattern.matcher(content);
//4.开始匹配
/**
* matcher.find()[考虑分组]
* 什么是分组,如(\d\d)(\d\d),第一个小括号表示第一组,第二个小括号表示第二组...
* 1.根据指定的规则,定位满足规则的 子字符串如((19)(98))
* 2.找到后将 子字符串的开始的索引记录到matcher对象的属性 int[] groups;
* 2.1 groups[0]=0,把该字符串的结束 索引+1的值记录到groups[1]=4
* 2.2 记录第一组括号匹配到的字符串 groups[2]=0,groups[3]=2 [即19]
* 2.3 记录第二组括号匹配到的字符串 groups[4]=2,groups[5]=4 [即98]
* 3.同时记录oldLast的值为 子字符串的结束的 索引+1的值即4,即下次执行find时,就从4开始匹配
* 根据groups[0]和groups[1]的记录的位置,从content开始截取子字符串。
*/
while(matcher.find()){
System.out.println("找到:"+matcher.group(0));
System.out.println("第一组小括号:"+matcher.group(1));
System.out.println("第二组小括号:"+matcher.group(2));
}
}
}
输出:
找到:1998
第一组小括号:19
第二组小括号:98
找到:1999
第一组小括号:19
第二组小括号:99
正则表达式语法
正则转义符
java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegExp02 {
public static void main(String[] args) {
String content="abc$(abc(123(";
//匹配(
//注意Java中,两个\\相当于其他语言的一个\
String regStr="\\(";
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while(matcher.find()){
System.out.println("找到"+matcher.group(0));
}
}
}
字符匹配夫
注意:\w还匹配下划线
选择匹配符
限定符
符号 | 含义 | 示例 | 说明 | 匹配输入 |
---|---|---|---|---|
* | 指定字符重复0次或n次(无要求) | (abc)* | 仅包含任意个abc的字符串,等效于\w* | abc、abcabc |
+ | 指定字符重复1次或n次(至少一次) | m+(abc)* | 以至少1个m开头,后接任意个abc的字符串 | m、mabc、mabcabc |
? | 指定字符重复0次或1次(最多一次) | m+(abc)? | 以至少1个m开头,后接ab或abc的字符 | mab、mabc、mmmab、mmabc |
{n} | 指定输入n个字符 | [abcd]{3} | 由abcd中字符组成的任意长度为3的字符串 | abc、bdc、adc |
{n,} | 指定至少n个匹配 | [abcd]{3,} | 由abcd中字母组成的任意长度不小于3的字符串 | aab、dbc、aaabdc |
{n,m} | 指定至少n个但不多于m个匹配 | [abcd]{3,5} | 由abcd中字母组成的任意长度不小于3,不大于5的字符串 | abc、abcd、aaaaa、bcdab |
定位符
分组
应用实例
Matcher类
java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class fir {
public static void main(String[] args) {
String content="hello edu jack tom hello smith hello";
String regStr="hello";
Pattern pattern =Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);
while(matcher.find()){
System.out.println("===========");
System.out.println(matcher.start());
System.out.println(matcher.end());
System.out.println("找到:"+content.substring(matcher.start(), matcher.end()));
}
}
}
反向引用