正则表达式

原创 2011年01月11日 20:59:00

java中的正则表达式遵循了像Python,unix中的一些工具相同的语法,使得正则表达式可以通用。
正则表达式是强大而灵活的文本处理工具。他们可以让我们以变成编程的方式找到文本中符合某种模式的内容,
然后我们能够对这些内容进行处理,例如:匹配、验证、选择等等。

介绍常用的正则表达式模式。在jdk文档的Pattern类中有更加详细的模式说明
构造                   匹配
字符
x                                         字符x
/uhhhh                            用16进制0xhhhh表示的unicode字符
/t                                    制表符
/n                                    换行符
/r                                    回车
/f                                    换页
字符类
[abc]                                a|b|c
[^abc]                            除了a,b,c之外的字符
[a-z]                                范围
[ab[cd]]                        并集
[a-z&&[abc]]                交集
预定义
.                                        任意字符
/s                                    空白字符(/t,/n,/r,/f)
/S                                    非空白字符
/d                                    数字[0-9]
/w                                    单词字符[a-zA-Z_0-9]
逻辑运算
XY                                    X后面跟Y
X|Y                                    X或Y
(X)                                    捕获组,能够用表达式/i引用第i个组
边界匹配
^                                        一行的开始
$                                        一行的结束
/b                                    词界
/B                                    非词界
/G                                    上一级的结尾
量词
x?                                    0或1
x*                                    0或多
x+                                    1或多
x{n}                                恰好n次
x{n,}                                恰好n次
x{n,m}                            >=n但是<m

上面就算是一些基本的语法了,下面我们来看一下在java中应该如何进行使用
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
System.out.println(m.matches());
其中Pattern为正则表达式的编译表现形式,它需要接收实现了CharSequence接口的类,比如String,StringBuffer等,然后编译成正则表达式。
然后使用了p.matcher(String s)方法得到匹配器Matcher.通过匹配器提供的方法我们能够能够找到s中与模式相匹配的这个子字符串以及其所在的位置等等。
p.matcher方法表示的是将整个字符串与模式进行匹配,能够匹配则返回true。匹配
下面就来看看具体我们能够进行哪些操作。
这之前还有一点要说的是,java语言中的表达式与其他语言在处理反斜杠的方式有些不同。
其他语言中"//"意味着我想在一个正则表达式中插入一个无格式的字面意义上的反斜杠。
而在java中,"//"意味着我正在插入一个正则表达式反斜杠,那么其后面的字符具有特殊的意义。例如我们想表达一个或者多个字符我们的正则表达式需要是"//w+"的这种形式。,如果我们想插入一个字面意义的反斜杠则是"////"。但是像制表符这样的字符只需要用到一个反斜杠:"/n/t"。

find()尝试查找与该模式匹配的输入序列的下一个子序列。从序列的开头开始,如果成功调用了一次这个方法,下一次调用之后会从匹配
find(int start)重置此匹配器,然后从输入序列中尝试查找匹配该模式的,从指定索引开始的下一个子序列。
group() 相当于group(0)
group(i) 返回上一次匹配捕获的子序列。0表示的就是整个子序列。

 

分组

A(B(C))D        这个表达式表示了三个组0 ABCD,1 BC, 2 C
可以使用groupCount()当前匹配子序列中的分组的数目。第0组不包括在内。
start(int group)返回在前一次匹配中找到的该组的起始下标。end(int group)返回在前一次匹配操作中族的最后一个字符的下标加1
看例子:

正则表达式为:(?m)(//S+)//s+((//S+)//s+(//S+))$
我们先来看一下它表达的意思。?m叫做模式标记,暂时记住它的意思是按照每一行来算末尾。
然后去掉分组的括号来看它表达的意思是:若干非空白符,若干空白符,若干非空白符,若干空白符,若干非空白符,结尾。显然这是要获取每一行的最后三个单词。

按照第一行为例,会匹配到the slithy toves。那么0组就是the slithy toves。1组就是the。。。

m.start(i)得到组的开始的下标 m.start()方法相当于调用了m.start(0);

 

模式标记

上面演示了两种设置模式标记的方式。
常用的有Pattern.CASE_INSENSITIVE        (?i)大小写不敏感
Pattern.COMMENTS                                        (?x)空格将被忽略掉。并且以#开头的注释也会被忽略
Patten.MULTILINE                                        (?m)在多行模式下,表达式'^'和'$'分别匹配一行的开始和结束。

使用正则表达式的操作:

实际上s.split()方法在源代码中就是调用了Pattern.compile("//.").split(s,0)的方法。
它表示以正则表达式为分界点,对实现了CharSequence接口的对象进行分割。split(s, limit)中的limit表示分为几项。分割之后剩下的所有内容为最后一项。
要注意使用特殊符号作为分割符的时候需要使用其正则表达式的字面意义。

替换操作

主要有如下的可用的方法:
另外还有个方法需要说一下m.reset()方法将会把其置为开始的状态。
replaceFirst("regex", "replace")替换在输入序列中查找到的第一个子序列。
replaceAll(...,...)替换在输入序列中查找到的所有子序列。
m.appendReplacement(StringBuffer , "replace");
这个语句在relace中有$符号和没有$符号的表现是不相同的。
没有的时候表示把输入序列中查找到的匹配的子序列使用replace字符替换到,并且把start()位置和end()位置之间的字符串压入sb。
有$符号的意义在于,把输入序列中匹配的序列中的对应的组的后面加入replace符号,然后压入sb。
m.appendTail(sb)表示把end()位置之后的所有的字符串都压入sb。
在使用正则表达式的时候一定要注意他们时刻的指针指向情况,和注意他们是遍历执行的。

正则表达式之?、(?:pattern)、(?!pattern)、(?=pattern)理解及应用

今天朋友问我一个问题,是这样子的,通过正则表达式匹配html标签input包含hidden的字符串,具体如下: "" 匹配下来,应该输出: "" 读了这个问题之后,觉得挺简单的,直...
  • sunhuaer123
  • sunhuaer123
  • 2013年11月15日 19:09
  • 59710

正则表达式 "^+$"等符号意义

1、字符/: 意义:对于字符,通常表示按字面意义,指出接着的字符为特殊字符,不作解释. 例如:/b/匹配字符’b’,通过在b 前面加一个反斜杠,也就是/b/,则该字符变成特殊字符,表示匹配一个单词的分...
  • github_36362235
  • github_36362235
  • 2016年11月23日 11:31
  • 1774

正则表达式——入门

写程序7年,从我身边接触到的人来看,相当多的程序员把正则表达式看得很高深,甚至觉得是一道不可跨越的鸿沟。有此想法的原因很简单:只是因为你没有花上几个小时的时间去学习一下正则的基础。对,只需要几个小时,...
  • sq_zhuyi
  • sq_zhuyi
  • 2013年10月18日 10:29
  • 18557

正则表达式中的"^"这个符号的一些思考

在学习正则表达式的时候,一些常见的规则我们都不难理解,但是有 一个正则表达式中的特殊字符让我一直有点搞不懂,就是”^”这个字符,文档上给出了解释是匹配输入的开始,如果多行标示被设置成了true,同时会...
  • sufubo
  • sufubo
  • 2016年03月27日 11:03
  • 18810

正则表达式中的逻辑运算符或(怎么用逻辑运算符或连接两个正则表达式)

今天使用正则表达式是遇到一个问题, 磨了半天, 发现犯了个低级错误, 因此记录下来加深印象 问题描述:  我需要把 ^drawable(-[a-zA-Z0-9]+)*$  和  ^mipmap(-[a...
  • voo00oov
  • voo00oov
  • 2015年07月20日 11:07
  • 9707

最全正则表达式汇总—想要的都有了

正则式太难学,而且容易忘记 ,西西是看过很多次,都是一会就全部不记得了滴。很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求。所以我最近把开发中常用的一...
  • SH_King
  • SH_King
  • 2015年07月24日 14:01
  • 1384

正则表达式简介及在C++11中的简单使用

正则表达式简介及在C++11中的简单使用
  • fengbingchun
  • fengbingchun
  • 2017年02月02日 13:41
  • 7571

正则表达式的四种功能

正则表达式主要是针对字符串进行操作,可以简化对字符串的复杂操作,其主要功能有匹配、切割、替换、获取。 一、匹配 检查字符串是否符合正则表达式中的规则,有一次不匹配,则返回false。如: Str...
  • tanpeng199134
  • tanpeng199134
  • 2016年09月18日 08:19
  • 1851

正则表达式常见例题

常见例题 例1:北美地区的电话号     编码方案:电话号码有一个3位数的区号和一位7位数的号码组成(这个7位数有分成  一个3位的局号和一个4位的路号,局号和路号之间使用连字符分隔) 每位电话号...
  • wenwen1538
  • wenwen1538
  • 2014年11月09日 15:23
  • 2364

正则表达式全解析+常用示例

在开始写这篇文章之前,我的心里还是纠结的。我在问自己要不要写这篇东西,关于相似的内容网上多如牛毛,而且还不乏珍品,况且,就算我写了也不一定能写的好。但是现在你既然看到了,那说明我还是写了出来。就算是对...
  • xuemoyao
  • xuemoyao
  • 2012年09月29日 18:40
  • 25646
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:正则表达式
举报原因:
原因补充:

(最多只允许输入30个字)