正则表达式
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Regexp {
public static void main(String[] args) {
String string ="Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++" +
"里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作" +
"为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 [1] 。" +
"Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 [2" +
"] 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 [3] 。";
//先创建一个Pattern对象,可以理解成就是一个正则表达式对象
Pattern pattern = Pattern.compile("[a-zA-Z]+");
//创建一个匹配器对象
//理解:匹配器按照pattern到string文本中匹配
//找到就返回true 否则false
Matcher matcher = pattern.matcher(string);
//可以开始循环匹配
while(matcher.find()){
System.out.println(matcher.group(0));
}
}
}
正则表达式就是某种模式去匹配字符串的一个公式
底层实现
matcher.find()
1.根据指定的规则,定位满总规则的子字符串(如:Java)
2.找到后,将字符串的开始的索引记录到matcher对象的属性 int[] group;
groups[0] = 0 把该子字符串的结果的索引+1的值记录到groups[1] = 4
3.同时纪律oldLast的值为 子字符串的结果的 索引+1的值即 4,即下次执行find时,就从4开始匹配
matcher.group(0)
public String group(int group) { if (first < 0) throw new IllegalStateException("No match found"); if (group < 0 || group > groupCount()) throw new IndexOutOfBoundsException("No group " + group); if ((groups[group*2] == -1) || (groups[group*2+1] == -1)) return null; return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString(); }
1.根据groups[0] 和 groups[1] 记录的位置,从content开始截取字符串返回 [0,4) 不包含索引为4的位置
如果正则表达式有()即分组 {(”(//d//d)(//d//d)“)}
取出的字符串规则如下
group(0) 表示匹配到的字符串
group(1) 表示匹配带的字符串的第一组字串
group(2) 表示匹配带的字符串的第二组字串
正则表达式语法
元字符- 转义号\\
在java的正则表达式中,两个\\代表其他语言中的一个\
用$去匹配 "abc$()" 规则"\\$"
元字符-字符匹配符
java正则表达式默认是区别字母大小写的,如何实现不区分大小写
1.(?i)abc 表示abc都不区分大小写
2.a(?i)bc 表示bc不区分大小写
3.a((?i)b)c 表示只有b不区分大小写
4.Pattern pat = Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
符号 | 意义 | 示例 | 解释 |
[] | 可接收的字符列表 | [efg] | e、f、g中发任意一个字符 |
[^] | 不可接收的字符列表 | [^ab] | 除了a、b之外的任意1个字符包括数字和特殊字符 |
- | 连字符 | A-Z | 任意单个大写字母 |
. | 匹配除\n以外的任意字符 | a..b | 以a开头,b结尾,中间包阔2个任意字符的长度为4的字符串 |
\\d | 匹配单个数字字符,相当于[0-9] | \\d{3}(\\d)? | 包含3个或4个数字的字符串 |
\\D | 匹配单个数字字符,相当于[^0-9] | \\D(\\d)* | 以单个非数字字符开头,后接任意个数字字符串 |
\\w | 匹配单个数字、大小写字母字符,相当于[0-9a-zA-Z] | \\d{3}\\w{4} | 以3个数字字符开头的长度为7的数字字母字符串 |
\\W | 匹配单个数字、大小写字母字符,相当于[^0-9a-zA-Z] | \\W+\\d{2} | 以至少1个非数字字母字符开头,2个数字字符结尾的字符串 |
元字符-选择匹配符
符号 | 意义 | 示例 | 解释 |
| | 匹配”|"之前或之后的表达式 | ab|cd | ab或者cd |
元字符-限定符(java匹配默认贪婪匹配,即尽可能匹配更多)
符号 | 意义 | 示例 | 解释 |
* | 指定字符重复0次或n次(无要求) | (abc)* | 仅包含任意个abc的字符产,等效于\w* |
+ | 指定字符重复1次或n次(至少一次) | m+(abc)* | 以至少1个m开头,后接任意个abc的字符串 |
? | 指定字符重复0次或1次(最多一次) | m+abc? | 以至少1个m开头,后接ab或abc的字符串 |
{n} | 只能输入n个字符 | [abcd]{3} | 由abcd中字母组成的任意长度为3的字符串 |
{n,} | 指定至少n个匹配 | [abcd]{3,} | 由abcd中字母组成的任意长度不小于3的字符串 |
{n,m} | 指定至少n个但不多于m个匹配 | [abcd]{3,5} | 由abcd中字母组成的任意长度不小于3,不大于5的字符串 |
元字符-定位符
符号 | 意义 | 示例 | 解释 |
^ | 指定起始字符 | ^[0-9]+[a-z]* | 以至少1个数字开头,后接任意个小写字母的字符串 |
$ | 指定结束字符 | ^[0-9]\\-[a-z]+$ | 以1个数字开头后接连字符”-“,并以至少1个小写字母结尾的字符串 |
\\b | 匹配目标字符串的边界 | jin\\b | 这里说的字符串的边界指的是子串间有空格,或者是目标字符串的结束位置 |
\\B | 匹配目标字符串的非边界 | jin\\B | 和\b的含义刚刚好相反 |