正则表达式的理解1

正则表达式:

什么是正则表达式?

我的理解:是一个规范,筛选出符合条件的字符串;

用简单的语言,代表了无数种字符串变化的可能,对字符串进行匹配。


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 。

你可能感兴趣的:(正则表达式的理解1)