我的开发笔记--Java正则基础语法

来源:互联网 发布:如何优化企业发展环境 编辑:程序博客网 时间:2024/06/09 22:57

这篇文章本来是写在博客园的,但是博客园对Markdown语法的支持很那个啥,让我很是苦恼啊,故此转过来。另一点CSDN好像不能发技术无关的随笔。

基础符号

这部分我只记录一下我常用的一些符号意义。
下面是基础符号的含义

符号 含义 (X) 捕获组,在正则表达式中,位于”()”中的内容,作为捕获组,如果有多个括号,使用group(int),从0开始捕获 [X] 匹配范围,中括号里面的内容作为匹配标志,如[abc],可以匹配单独的字符”a”,”b”或者”c” X{} 出现次数,一般有{n},{n,}{n,m}等写法,分别表示X只出现n次,出现至少n次,出现范围在n和m之间。 . 匹配符号,一般表示除了空白字符的任意字符,如果需要注释使用”\.”,就可以注释点其特殊含义。 \d 代表0-9的任意数字,等价于[0-9],\D表示除了0-9的任意字符 \w 代表单词字符。\W等价于非单词字符 \s 空白字符,\S代表非空白字符 ^ 放置行头,表示从一行的起始位置开始匹配。放置在[]里面,如[^a]除了a的任意字符 $ 表示匹配到一行的结尾。

上述这些符号,可以完成一些比较基本的语法匹配了,例如手机号码匹配”^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匹配式的工作模式。

常量值 含义 CANON_EQ Enables canonical equivalence.(启用规范的等价,应该是默认的,只匹配) CASE_INSENSITIVE Enables case-insensitive matching.(不区分大小写) COMMENTS Permits whitespace and comments in pattern.(模式中允许空白和注释) DOTALL Enables dotall mode.(这种模式下.匹配行尾) LITERAL Enables literal parsing of the pattern.(启动字面量解析模式) MULTILINE Enables multiline mode.(多行模式) UNICODE_CASE Enables Unicode-aware case folding.(If your code is intended to be portable and uses case-insensitive matching on non-ASCII characters, you should use this flag.) UNICODE_CHARACTER_CLASS Enables the Unicode version of Predefined character classes and POSIX character classes.(启用预定义的字符类和POSIX字符类的Unicode版本) UNIX_LINES Enables Unix lines mode.(启动Unix的行模式)

上述几个常量我也就用过MULTILINE,其他的我暂时没有用过,所以不做解释。

Matcher

使用Patter的实例patter,调用patter.matcher(CharSequence input),input需要传入实现的CharSequence接口的实参,一般就是字符串。Matcher中有大量的方法,我只写下少量我常用的。

方法名 用途 boolean find() 从下个子序列中找出符合规则的内容,返回true表示捕获到内容,同时根据匹配模式,匹配指针会做出后移,或者其他操作 boolean find(int n) 直接捕获n处符合匹配的字符串,如果没有捕获到内容,会报错 String group() 返回符合规则的捕获组内容,没有指定参数返回gourp(0)内容 String group(int n) 返回n组的捕获内容,如果输入的int值无捕获组,会报错 int gourpCount() 返回匹配到捕获组的个数,在使用group(int)时,可以使用这个方法来避免异常 int end() 返回最后一个匹配字符的偏移量 int start() 返回匹配字符串的起始位置 void reset() 将Matcher置为初始状态
1 0
原创粉丝点击