正则表达式是字符串执行模式匹配的技术
String regStr = "\\d\\d\\d\\d";//这里\\d表示任意一个数字,四个代表四个数字
Pattern pattern = Pattern.compile(regStr);
Matcher matcher = pattern.matcher(content);//content就是要查询的原文
/**
*matcher.find 完成的任务
*1. 根据规则,定位满足规则的子字符串(如1998)
*2. 找到后,将子字符串的开始索引记录到matcher对象的属性int[] groups, groups[0]为字符串开始位置的索引值,groups[1]为结束的索引+1的值,即下次执行find开始的位置
*/
while(matcher.find())
{
System.out.println("找到:"+ matcher.group(0));
}
元字符从功能上分为:
java的正则表达式中,两个\代表其他语言中的一个\
需要用到转义符号的字符有: . * + ( ) <span data-formula=" / \ ? [ ] ^ { }
符号 | 功能 | 示例 | 解释 |
---|---|---|---|
[] | 可接受的字符列表 | [efgh] | e、f、g、h中的任意一个字符 |
[^] | 不可接受的字符列表 | [^abc] | 除a、b、c之外的任意一个字符,包括数字和特殊符号 |
- | 连字符 | A-Z | 任意单个大写字母 |
里面的?代表0个或1个,+代表至少1个,*代表任意多个, {n}代表连续n个
想要既匹配这个,又匹配那个,就要用到选择匹配符
ab|cd 匹配ab或者cd
1111111aaaaheloo 使用a{3,4}去匹配表示匹配aaa或者aaaa,这里java的匹配是贪婪匹配,尽量匹配多的,所以这里只会返回一个aaaa。
而使用\d{2,5}会返回一个11111和一个11
定位符,规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置,这个也是相当有用的。
常用分组构造形式 | 说明 |
---|---|
(pattern) | 非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其他捕获结果则根据左括号的顺序,从1开始自动编号 |
(?<name>pattern) | 命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号代替尖括号,例如(?'name') |
(?:pattern) | 匹配pattern但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用得匹配。这对于用"or"字符(|)组合模式部件的情况很有用。例如,'industr(?:y|ies)势必'industry|industries'更经济的表达式、 |
(?=pattern) | 它是一个非捕获匹配,例如,'Windows(?=95|98|NT|2000)'匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows" |
(?!pattern) | 该表达式匹配不处于匹配pattern的字符串的起始点的搜索字符串。它是一个非捕获匹配。例如,'Windows(?!95|98|NT|2000)'匹配"Windows 3.1"中的"Windows",但不匹配Windows 2000"中的"Windows"。 |
\d+ 默认为贪婪匹配 \d+?就是非贪婪匹配
pattern对象是一个正则表达式对象。Pattern类没有公共构造方法。要创建一个Pattern对象,调用其公用静态方法,它返回一个pattern对象。该方法接受一个正则表达式作为它的第一个参数,比如:Pattern r = Pattern.compile(pattern);
Pattern.matches(regStr, content)是整体匹配,返回boolean值,不返回匹配的内容
Matcher对象时对输入字符串进行解释和匹配的引擎。与Pattern类一样,Match也没有公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象。
一个非强制异常类,表示一个正则表达式模式中的语法错误
本文章使用limfx的vscode插件快速发布