正则表达式:
什么是正则表达式?
我的理解:是一个规范,筛选出符合条件的字符串;
用简单的语言,代表了无数种字符串变化的可能,对字符串进行匹配。
Java 之中正则表达式的简单使用:
String pattern="hello"; // 用字符串来记录正则表达式的匹配模式
String str="hello world"; // 一个字符串
boolen flag=str.matches(pattern); // 调用字符串的matches 方法来进行匹配,传入的参数是正则表达式的
模式,返回的是一个 布尔值 表示是否匹配。
这里的程序的返回结果是false,表示不匹配。
但是str 变量之中,明明有 hello ,但是为什么不匹配呢?
解释一下 pattern="hello" 这个模式的意思,
这个模式只是表示一种字符串的可能性 hello
但是我们的str 是 "hello world"
所以:两者是不匹配的。
如何才能够匹配呢?
换一种模式
String pattern="hello.*"
这里解释pattern 的模式的含义:hello后面可以跟随随意的字符,跟随字符的数量也是任意的。
helloaa 是pattern 可以匹配的一种可能。
hellob 是pattern可以匹配的一种可能。
后面还有许许多多的可能性,这里就是不举例子了。
所以给出一个结论:正则表达式 使用简便的语言将无数种可能性 进行包含。
连续次数的匹配:
Java之中语法:
{n,m} n,m 是数字。n是下限,m是上限。
举个例子
String pattern="a{2,3}"; 表示匹配 aa或者 aaa 而不是 aaa和aaaa
因为{} 只是起到一种修饰的作用,描述一个可能,a可能出现两次,a可能出现三次,
而不是描述 后面还有两个a,后面还有三个a 。
其他的使用方式的列举
String pattern="a{2}"; // 表示a 出现的次数最少两个,没有上限的限制
String pattern="a{,2}";// a出现的次数最多2个,下限是0
问题:上面的描述只是修饰字符 ,如果想表示单词连续出现,如何书写匹配模式?
例子: String pattern="(hello){2,3}"; // 表示hello单词出现两次或者三次。
这里的特别之处 :使用了() 。括号的意思是将括号之中的内容当作一个整体,
所以后来的修饰就是,就是修饰了hello 这个单词了。
在正则表达式之中,括号也是有着特殊的称呼,分组。
+ 表示 前面的字符最少出现一次
? 表示 前面的字符出现0次或者是 1次。
Shell之中正则表达式的不同之处:
\{m,n\} \(\) \? \+
作用是完全相同的,语法上面加上了反斜杠。
分组:
什么是分组?
我的理解,正则表达式之中 使用括号进行包括,括号里的就是分组。
例子:
String pattern="h(ello)"; // 表示的字符串的可能性是 hello
提示:括号加与不加,对匹配的可能性没有改变。
以上面的例子为例,来说明分组的序号:
分组从0开始 分组0表示的是完全匹配的,这里的话,就是hello
分组1 才是括号之中的内容 ello。
分组的序号的判断方式:
从左往右,看遇到的左边的括号,遇到的第一个( 是分组1 ,第二个是分组2 以此类推。
后向引用:
什么是后向引用?
我的理解:在正则表达式的后面,引用前面匹配的分组,作为匹配的一种模式。
举个例子来说明:
String line="hello world hello";
这里的字符串有点特别,以单词hello 开头,以单词hello 结尾。
问题:匹配这样类型的字符串,如何书写正则表达式?
String pattern="(hello) world \\1";
提示:前面使用了(hello) 后面使用了 \\1
\\1 就是后向引用的语法,表示匹配的第一个分组,hello
如果模式是 String pattern="(bello) world \\1"
\\1 表示的就是bello 。