我的开发笔记--Java正则基础语法
来源:互联网 发布:如何优化企业发展环境 编辑:程序博客网 时间:2024/06/09 22:57
这篇文章本来是写在博客园的,但是博客园对Markdown语法的支持很那个啥,让我很是苦恼啊,故此转过来。另一点CSDN好像不能发技术无关的随笔。
基础符号
这部分我只记录一下我常用的一些符号意义。
下面是基础符号的含义
上述这些符号,可以完成一些比较基本的语法匹配了,例如手机号码匹配”^1[3587][\\d]{9}$”。
另外在Java SE的API中还有许多关于正则的符号,个人原因只说一些常用,在Java SE API中还有一些其它符号。
特殊符号
|:表示或。例如X|Y,匹配X或者Y中的一个,如果两个都出现,看具体正则reg,一般匹配符合要求的第一个。
\Q和\E:举个例子,一句reg,中间有.\$等特殊符号,我们需要一个个使用\来转义,如果把reg头加上\Q,尾加上\E,就可以少写很多\
\b:用来匹配单词,但是不匹配单词正确性。例如Hello,He say Hello to me!使用reg=\bHe\b。那么只能匹配中间的He,因为只有He是一个完整的单词,符合\bHe\b的规则。
\B:这个\B不是上面的跟\d和\D意义相反那么容易区分。如果按照和\b意义相反,那么在Hello,He say Hello to me!这句话里面,使用\BHe\B,应该可以匹配出点什么东西来,但是实际上却没有。看API,意思是A non-word boundary。字面了解是非单词边界,可能有点难以理解,它只能匹配一个单词里面,不包含首单词和尾单词的字符。举个例子,hello ella!,使用reg=\Bel\B,那么它会匹配出来一个el来,是hello里面的el,而第二个ella就匹配不出来了。
\A:从开段开始匹配,例如”hellohello”,使用reg=\Ahello,只会匹配出来一个hello,因为这句输入只有一个开头
\G:The end of the previous match。上一次匹配的结尾,这个跟匹配的模式和匹配的指针位置有关,我不太清楚,就不误导人了
\Z:The end of the input but for the final terminator, if any.求指导
\z:The end of the input.求指导
特殊构造
(?:X):作为非匹配组,X内容不会被捕获
(?=X):X, via zero-width positive lookahead。直译是零宽度正向的预测先行。首先这个预测先行,指的是左边的字符,而不是右边的字符。如XXabSS,XX是ab的先行,SS是ab的后行。这个东西就匹配在”X”前面的内容。如”XXabcYYabc”,”[\s\S]*?(?=abc)”可以匹配出来XX和YY。
(?!X):X, via zero-width negative lookahead。直译是零宽度的负向预测先行。负个鸡毛,英死早,不会意译。(?=X)表示的是匹配内容右边是X,这个就表示匹配内容的是右边不是X。如输入”XXabcYYabc”,reg是”[\w]{2}(?!X)[\w]{2}”,匹配出来XXab和cYYa。
(?<=X):X, via zero-width positive lookbehind.直译是零宽度的正向预测后行。表示匹配内容右边的字符串是X。测试一下,输入”XXabcYYabc”,正表是”[\w].*?(?<=abc)”,匹配到了”XXabc”和”YYabc”。
(?<!X):直译是零宽度的负向预测后行。表示匹配内容右边不是X。测试一下,输入”XXabcYYabc”,reg是”[\w].*?(?<!abc)abc”,可以匹配到XXabc和YYabc。
(?>X):作为一个独立的非捕获组。
捕获模式
有三种捕获模式,如下
分别是饥饿模式Greedy quantifiers,懒惰模式Reluctant quantifiers和占有模式Reluctant quantifiers。这个三个模式,分别是在匹配符后面不加符号,加”?”和加”+”。
对于饥饿模式和懒惰模式,通过下面这个例子,分析一下。
input是
<font size=4>叔叔好,我叫小明</font><font size=4>小明啊,啥时候再到王叔叔家玩</font><font size=4>老王啊,你不用跟我家宋小明客套,你巴不得他不去你家吧,他跟你家小红很熟络,我都快愁死了</font><font size=4>是啊,老宋啊,这的确让我很苦恼,小孩子早恋不好啊,但是她俩从小玩到大,哎!</font>我们需要捕获<font size=4></font>这对标签里面的内容,如果是饥饿模式,他的reg如下<font size=4>([\s\S]*)</font>只会得出一个匹配结果,叔叔好,我叫小明</font><font size=4>小明啊,啥时候再到王叔叔家玩</font><font size=4>老王啊,你不用跟我家宋小明客套,你巴不得他不去你家吧,他跟你家小红很熟络,我都快愁死了</font><font size=4>是啊,老宋啊,这的确让我很苦恼,小孩子早恋不好啊,但是她俩从小玩到大,哎!可以看出来,饥饿模式只匹配了一对标签的内容,而使用懒惰模式,他跟饥饿模式的区别是把reg改成如下<font size=4>([\s\S]*?)</font>可以得出四对匹配结果,这里不贴结果了
从上述的内容可以得出,饥饿模式,他会匹配最大长度的字符。而懒惰模式只匹配最小长度的字符。
至于独占模式,这个我用的不多,它匹配时,会占据整个字符串,并且向前匹配时绝不会完后回退,在大部分情况下,它如果一次匹配没有找到符合条件的,他的匹配指针是不会向后回退的。
Java中的常用类
写完写常用正则符号以后,对于Java中的一些类和方法也做下记录。
Pattern
Pattern有两个静态方法可以获取Pattern的实例,分别是
compile(String regex)和compile(String regex,int flag),第二个方法可以指定Pattern匹配式的工作模式。
上述几个常量我也就用过MULTILINE,其他的我暂时没有用过,所以不做解释。
Matcher
使用Patter的实例patter,调用patter.matcher(CharSequence input),input需要传入实现的CharSequence接口的实参,一般就是字符串。Matcher中有大量的方法,我只写下少量我常用的。
- 我的开发笔记--Java正则基础语法
- Java基础笔记:Java的基本语法
- 基础语法 【java笔记】
- java基础语法笔记
- Java 基础语法笔记
- 【我的Java笔记】正则表达式
- 正则表达式的基础语法
- 正则表达式的基础语法
- 正则表达式的基础语法
- 我的Java基础的学习笔记
- java 基础语法(笔记)
- java语法基础学习笔记
- Java之基础语法笔记
- Java之基础语法笔记
- java学习笔记--基础语法
- Java正则表达式基础案例和语法
- Java基础——正则表达式语法
- 我的java基础学习笔记(一)
- 搜索 BFS
- 页面显示时间日期,通过jquery动态向表格添加数据
- MySQL常用的日期时间函数
- R-图形化展示变量间相关性
- 浅析c、c++,vc++
- 我的开发笔记--Java正则基础语法
- 自定义控件三部曲之绘图篇(十一)——Paint之setXfermode(二)
- maven导入自己的jar包教程
- Android笔记之ConnectivityManager
- 7种形式的Android Dialog使用举例
- Collection(一)-----ArrayList
- 详解win7下安装VC++6.0和MSDN
- ArcGis Server10.2安装
- 使用Sublime Text快速编译运行java程序