正则表达式文档格式.docx
- 文档编号:1499968
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:23
- 大小:225.49KB
正则表达式文档格式.docx
《正则表达式文档格式.docx》由会员分享,可在线阅读,更多相关《正则表达式文档格式.docx(23页珍藏版)》请在冰点文库上搜索。
用来匹配它的正则表达式如图一所示。
在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从0到9。
因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“\”。
图一:
匹配所有123-12-1234形式的社会安全号码
假设进行搜索的时候,你希望连字符号可以出现,也可以不出现——即,999-99-9999和999999999都属于正确的格式。
这时,你可以在连字符号后面加上“?
”数量限定符号,如图二所示:
图二:
匹配所有123-12-1234和123121234形式的社会安全号码
下面我们再来看另外一个例子。
美国汽车牌照的一种格式是四个数字加上二个字母。
它的正则表达式前面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。
图三显示了完整的正则表达式。
图三:
匹配典型的美国汽车牌照号码,如8836KV
1.5“否”符号
“^”符号称为“否”符号。
如果用在方括号内,“^”表示不想要匹配的字符。
例如,图四的正则表达式匹配所有单词,但以“X”字母开头的单词除外。
图四:
匹配所有单词,但“X”开头的除外
1.6圆括号和空白符号
假设要从格式为“June26,1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式可以如图五所示:
图五:
匹配所有MothDD,YYYY格式的日期
新出现的“\s”符号是空白符号,匹配所有的空白字符,包括Tab字符。
如果字符串正确匹配,接下来如何提取出月份部分呢?
只需在月份周围加上一个圆括号创建一个组,然后用OROAPI(本文后面详细讨论)提取出它的值。
修改后的正则表达式如图六所示:
图六:
匹配所有MonthDD,YYYY格式的日期,定义月份值为第一个组
1.7其它符号
为简便起见,你可以使用一些为常见正则表达式创建的快捷符号。
如表二所示:
表二:
常用符号
例如,在前面社会安全号码的例子中,所有出现“[0-9]”的地方我们都可以使用“\d”。
修改后的正则表达式如图七所示:
图七:
匹配所有123-12-1234格式的社会安全号码
二、Jakarta-ORO库
有许多源代码开放的正则表达式库可供Java程序员使用,而且它们中的许多支持Perl5兼容的正则表达式语法。
我在这里选用的是Jakarta-ORO正则表达式库,它是最全面的正则表达式API之一,而且它与Perl5正则表达式完全兼容。
另外,它也是优化得最好的API之一。
Jakarta-ORO库以前叫做OROMatcher,DanielSavarese大方地把它赠送给了JakartaProject。
你可以按照本文最后参考资源的说明下载它。
我首先将简要介绍使用Jakarta-ORO库时你必须创建和访问的对象,然后介绍如何使用Jakarta-OROAPI。
▲PatternCompiler对象
首先,创建一个Perl5Compiler类的实例,并把它赋值给PatternCompiler接口对象。
Perl5Compiler是PatternCompiler接口的一个实现,允许你把正则表达式编译成用来匹配的Pattern对象。
▲Pattern对象
要把正则表达式编译成Pattern对象,调用compiler对象的compile()方法,并在调用参数中指定正则表达式。
例如,你可以按照下面这种方式编译正则表达式“t[aeio]n”:
默认情况下,编译器创建一个大小写敏感的模式(pattern)。
因此,上面代码编译得到的模式只匹配“tin”、“tan”、“ten”和“ton”,但不匹配“Tin”和“taN”。
要创建一个大小写不敏感的模式,你应该在调用编译器的时候指定一个额外的参数:
创建好Pattern对象之后,你就可以通过PatternMatcher类用该Pattern对象进行模式匹配。
▲PatternMatcher对象
PatternMatcher对象根据Pattern对象和字符串进行匹配检查。
你要实例化一个Perl5Matcher类并把结果赋值给PatternMatcher接口。
Perl5Matcher类是PatternMatcher接口的一个实现,它根据Perl5正则表达式语法进行模式匹配:
使用PatternMatcher对象,你可以用多个方法进行匹配操作,这些方法的第一个参数都是需要根据正则表达式进行匹配的字符串:
·
booleanmatches(Stringinput,Patternpattern):
当输入字符串和正则表达式要精确匹配时使用。
换句话说,正则表达式必须完整地描述输入字符串。
booleanmatchesPrefix(Stringinput,Patternpattern):
当正则表达式匹配输入字符串起始部分时使用。
booleancontains(Stringinput,Patternpattern):
当正则表达式要匹配输入字符串的一部分时使用(即,它必须是一个子串)。
另外,在上面三个方法调用中,你还可以用PatternMatcherInput对象作为参数替代String对象;
这时,你可以从字符串中最后一次匹配的位置开始继续进行匹配。
当字符串可能有多个子串匹配给定的正则表达式时,用PatternMatcherInput对象作为参数就很有用了。
用PatternMatcherInput对象作为参数替代String时,上述三个方法的语法如下:
booleanmatches(PatternMatcherInputinput,Patternpattern)
booleanmatchesPrefix(PatternMatcherInputinput,Patternpattern)
booleancontains(PatternMatcherInputinput,Patternpattern)
三、应用实例
下面我们来看看Jakarta-ORO库的一些应用实例。
3.1日志文件处理
任务:
分析一个Web服务器日志文件,确定每一个用户花在网站上的时间。
在典型的BEAWebLogic日志文件中,日志记录的格式如下:
分析这个日志记录,可以发现,要从这个日志文件提取的内容有两项:
IP地址和页面访问时间。
你可以用分组符号(圆括号)从日志记录提取出IP地址和时间标记。
首先我们来看看IP地址。
IP地址有4个字节构成,每一个字节的值在0到255之间,各个字节通过一个句点分隔。
因此,IP地址中的每一个字节有至少一个、最多三个数字。
图八显示了为IP地址编写的正则表达式:
图八:
匹配IP地址
IP地址中的句点字符必须进行转义处理(前面加上“\”),因为IP地址中的句点具有它本来的含义,而不是采用正则表达式语法中的特殊含义。
句点在正则表达式中的特殊含义本文前面已经介绍。
日志记录的时间部分由一对方括号包围。
你可以按照如下思路提取出方括号里面的所有内容:
首先搜索起始方括号字符(“[”),提取出所有不超过结束方括号字符(“]”)的内容,向前寻找直至找到结束方括号字符。
图九显示了这部分的正则表达式。
图九:
匹配至少一个字符,直至找到“]”
现在,把上述两个正则表达式加上分组符号(圆括号)后合并成单个表达式,这样就可以从日志记录提取出IP地址和时间。
注意,为了匹配“--”(但不提取它),正则表达式中间加入了“\s-\s-\s”。
完整的正则表达式如图十所示。
图十:
匹配IP地址和时间标记
现在正则表达式已经编写完毕,接下来可以编写使用正则表达式库的Java代码了。
为使用Jakarta-ORO库,首先创建正则表达式字符串和待分析的日志记录字符串:
这里使用的正则表达式与图十的正则表达式差不多完全相同,但有一点例外:
在Java中,你必须对每一个向前的斜杠(“\”)进行转义处理。
图十不是Java的表示形式,所以我们要在每个“\”前面加上一个“\”以免出现编译错误。
遗憾的是,转义处理过程很容易出现错误,所以应该小心谨慎。
你可以首先输入未经转义处理的正则表达式,然后从左到右依次把每一个“\”替换成“\\”。
如果要复检,你可以试着把它输出到屏幕上。
初始化字符串之后,实例化PatternCompiler对象,用PatternCompiler编译正则表达式创建一个Pattern对象:
现在,创建PatternMatcher对象,调用PatternMatcher接口的contain()方法检查匹配情况:
接下来,利用PatternMatcher接口返回的MatchResult对象,输出匹配的组。
由于logEntry字符串包含匹配的内容,你可以看到类如下面的输出:
3.2HTML处理实例一
下面一个任务是分析HTML页面内FONT标记的所有属性。
HTML页面内典型的FONT标记如下所示:
程序将按照如下形式,输出每一个FONT标记的属性:
在这种情况下,我建议你使用两个正则表达式。
第一个如图十一所示,它从字体标记提取出“"
face="
Arial,Serif"
size="
+2"
color="
red"
”。
图十一:
匹配FONT标记的所有属性
第二个正则表达式如图十二所示,它把各个属性分割成名字-值对。
图十二:
匹配单个属性,并把它分割成名字-值对
分割结果为:
现在我们来看看完成这个任务的Java代码。
首先创建两个正则表达式字符串,用Perl5Compiler把它们编译成Pattern对象。
编译正则表达式的时候,指定Perl5Compiler.CASE_INSENSITIVE_MASK选项,使得匹配操作不区分大小写。
接下来,创建一个执行匹配操作的Perl5Matcher对象。
假设有一个String类型的变量html,它代表了HTML文件中的一行内容。
如果html字符串包含FONT标记,匹配器将返回true。
此时,你可以用匹配器对象返回的MatchResult对象获得第一个组,它包含了FONT的所有属性:
接下来创建一个PatternMatcherInput对象。
这个对象允许你从最后一次匹配的位置开始继续进行匹配操作,因此,它很适合于提取FONT标记内属性的名字-值对。
创建PatternMatcherInput对象,以参数形式传入待匹配的字符串。
然后,用匹配器实例提取出每一个FONT的属性。
这通过指定PatternMatcherInput对象(而不是字符串对象)为参数,反复地调用PatternMatcher对象的contains()方法完成。
PatternMatcherInput对象之中的每一次迭代将把它内部的指针向前移动,下一次检测将从前一次匹配位置的后面开始。
本例的输出结果如下:
3.3HTML处理实例二
下面我们来看看另一个处理HTML的例子。
这一次,我们假定Web服务器从移到了。
现在你要修改一些页面中的链接:
执行这个搜索的正则表达式如图十三所示:
图十三:
匹配修改前的链接
如果能够匹配这个正则表达式,你可以用下面的内容替换图十三的链接:
注意#字符的后面加上了$1。
Perl正则表达式语法用$1、$2等表示已经匹配且提取出来的组。
图十三的表达式把所有作为一个组匹配和提取出来的内容附加到链接的后面。
现在,返回Java。
就象前面我们所做的那样,你必须创建测试字符串,创建把正则表达式编译到Pattern对象所必需的对象,以及创建一个PatternMatcher对象:
接下来,用com.oroinc.text.regex包Util类的substitute()静态方法进行替换,输出结果字符串:
Util.substitute()方法的语法如下:
这个调用的前两个参数是以前创建的PatternMatcher和Pattern对象。
第三个参数是一个Substiution对象,它决定了替换操作如何进行。
本例使用的是Perl5Substitution对象,它能够进行Perl5风格的替换。
第四个参数是想要进行替换操作的字符串,最后一个参数允许指定是否替换模式的所有匹配子串(Util.SUBSTITUTE_ALL),或只替换指定的次数。
常用正则表达式
^\d+$ //匹配非负整数(正整数+0)即:
不能有空格不能非数字
^[0-9]*[1-9][0-9]*$ //匹配正整数
^((-\d+)|(0+))$ //匹配非正整数(负整数+0)
^-[0-9]*[1-9][0-9]*$ //匹配负整数
^-?
\d+$ //匹配整数
^\d+(\.\d+)?
$ //匹配非负浮点数(正浮点数+0)
^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ //匹配正浮点数
^((-\d+(\.\d+)?
)|(0+(\.0+)?
))$ //匹配非正浮点数(负浮点数+0)
^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ //匹配负浮点数
^(-?
\d+)(\.\d+)?
$ //匹配浮点数
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$ //匹配email地址复杂的:
^\+?
[a-z0-9](([-+.]|[_]+)?
[a-z0-9]+)*@([a-z0-9]+(\.|\-))+[a-z]{2,6}$
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*([,;
]\s*\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)*多个邮件用逗号或空格分隔
^[a-zA-z]+:
//匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?
\S*)?
$ //匹配url
[\u4e00-\u9fa5]//匹配中文字符的正则表达式
[^\x00-\xff]//匹配双字节字符(包括汉字在内)
//应用:
计算字符串的长度(双字节字符长度计2)String.prototype.len=function(){returnthis.replace([^\x00-\xff]/g,"
aa"
).length;
}
\n[\s|]*\r//匹配空行的正则表达式
/<
(.*)>
.*<
\/\1>
|<
(.*)\/>
///匹配HTML标记的正则表达式<
(\S*?
)[^>
]*>
.*?
|<
/>
能匹配部分,对于复杂的嵌套标记依旧无能为力
(^\s*)|(\s*$)//匹配首尾空格的正则表达式可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)
^\S+[a-zA-Z]$//不能为空不能有空格只能是英文字母
\S{6,}//不能为空六位以上
(.*)(\.jpg|\.bmp)$//只能是jpg和bmp格式
^\d{4}\-\d{1,2}-\d{1,2}$//只能是2004-10-22格式
^0$//至少选一项
^0{2,}$//至少选两项
^[\s|\S]{20,}$//不能为空二十字以上
^(\([0-9]+\))?
[0-9]{7,8}$//电话号码7位或8位或前面有区号例如(022)87341628
\n\s*\r//空白行的正则表达式
[1-9]\d{5}(?
!
\d)//匹配中国邮政编码
\d+\.\d+\.\d+\.\d+//匹配ip地址
^[1-9]\d*$ //匹配正整数
^-[1-9]\d*$ //匹配负整数
[1-9]\d*$ //匹配整数
^[1-9]\d*|0$ //匹配非负整数(正整数+0)
^-[1-9]\d*|0$ //匹配非正整数(负整数+0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配负浮点数
([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?
\.0+|0)$ //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?
\.0+|0$ //匹配非负浮点数(正浮点数+0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?
\.0+|0$ //匹配非正浮点数(负浮点数+0)
x字符x
\\反斜线字符
\0n八进制值的字符0n(0<
=n<
=7)
\0nn八进制值的字符0nn(0<
\0mnn八进制值的字符0mnn0mnn(0<
=m<
=3,0<
\xhh十六进制值的字符0xhh
\uhhhh十六进制值的字符0xhhhh
\t制表符('
\u0009'
)
\n换行符('
\u000A'
\r回车符('
\u000D'
\f换页符('
\u000C'
\a响铃符('
\u0007'
\e转义符('
\u001B'
\cxT对应于x的控制字符x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 正则 表达式