正则表达式详解
- 格式:docx
- 大小:274.63 KB
- 文档页数:14
Python系列之正则表达式详解Python 正则表达式模块 (re) 简介Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,和 Perl 脚本的正则表达式功能类似,使⽤这⼀内嵌于 Python 的语⾔⼯具,尽管不能满⾜所有复杂的匹配情况,但⾜够在绝⼤多数情况下能够有效地实现对复杂字符串的分析并提取出相关信息。
Python 会将正则表达式转化为字节码,利⽤ C 语⾔的匹配引擎进⾏深度优先的匹配。
表 1. 正则表达式元字符和语法符号说明实例.表⽰任意字符,如果说指定了 DOTALL 的标识,就表⽰包括新⾏在内的所有字符。
'abc' >>>'a.c' >>>结果为:'abc'^表⽰字符串开头。
'abc' >>>'^abc' >>>结果为:'abc'$表⽰字符串结尾。
'abc' >>>'abc$' >>>结果为:'abc'*, +, ?'*'表⽰匹配前⼀个字符重复 0 次到⽆限次,'+'表⽰匹配前⼀个字符重复 1次到⽆限次,'?'表⽰匹配前⼀个字符重复 0 次到1次'abcccd' >>>'abc*' >>>结果为:'abccc''abcccd' >>>'abc+' >>>结果为:'abccc''abcccd' >>>'abc?' >>>结果为:'abc'*?, +?, ??前⾯的*,+,?等都是贪婪匹配,也就是尽可能多匹配,后⾯加?号使其变成惰性匹配即⾮贪婪匹配'abc' >>>'abc*?' >>>结果为:'ab''abc' >>>'abc??' >>>结果为:'ab''abc' >>>'abc+?' >>>结果为:'abc'{m}匹配前⼀个字符 m 次'abcccd' >>>'abc{3}d' >>>结果为:'abcccd' {m,n}匹配前⼀个字符 m 到 n 次'abcccd' >>> 'abc{2,3}d' >>>结果为:'abcccd' {m,n}?匹配前⼀个字符 m 到 n 次,并且取尽可能少的情况'abccc' >>> 'abc{2,3}?' >>>结果为:'abcc'\对特殊字符进⾏转义,或者是指定特殊序列 'a.c' >>>'a\.c' >>> 结果为: 'a.c'[]表⽰⼀个字符集,所有特殊字符在其都失去特殊意义,只有: ^ - ] \ 含有特殊含义'abcd' >>>'a[bc]' >>>结果为:'ab'|或者,只匹配其中⼀个表达式,如果|没有被包括在()中,则它的范围是整个正则表达式'abcd' >>>'abc|acd' >>>结果为:'abc' ( … )被括起来的表达式作为⼀个分组. findall 在有组的情况下只显⽰组的内容 'a123d' >>>'a(123)d' >>>结果为:'123'(?#...)注释,忽略括号内的内容特殊构建不作为分组 'abc123' >>>'abc(?#fasd)123' >>>结果为:'abc123'(?= …)表达式’…’之前的字符串,特殊构建不作为分组在字符串’ pythonretest ’中 (?=test) 会匹配’pythonre ’(?!...)后⾯不跟表达式’…’的字符串,特殊构建不作为分组如果’ pythonre ’后⾯不是字符串’ test ’,那么(?!test) 会匹配’ pythonre ’(?<=… )跟在表达式’…’后⾯的字符串符合括号之后的正则表达式,特殊构建不作为分组正则表达式’ (?<=abc)def ’会在’ abcdef ’中匹配’def ’(?:)取消优先打印分组的内容'abc' >>>'(?:a)(b)' >>>结果为'[b]'?P<>指定Key'abc' >>>'(?P<n1>a)>>>结果为:groupdict{n1:a}表 2. 正则表达式特殊序列特殊表达式序列说明\A只在字符串开头进⾏匹配。
正则表达式(Regular Expression)是一种强大的文本处理工具,它使用特定的模式来匹配字符串中的文本。
下面是一些正则表达式的例子,并对其进行了详细解释:基础匹配表达式:a解释:这个正则表达式会匹配任何包含字母“a”的字符串。
字符类表达式:[abc]解释:这个正则表达式会匹配任何单个字母“a”、“b”或“c”。
选择、分组和引用表达式:(ab|cd)解释:这个正则表达式会匹配字符串“ab”或“cd”。
括号表示分组,|表示“或”,所以这个正则表达式可以匹配“ab”或“cd”。
预查表达式:(?=abc)解释:这个正则表达式会匹配任何前面是“abc”的字符串。
但请注意,它只是预查,并不会消耗字符,也就是说,它只是检查前面的字符串是否符合后面的模式,但不会移动指针。
后查表达式:(?<=abc)解释:这个正则表达式会匹配任何后面是“abc”的字符串。
和预查一样,它只是检查,并不会消耗字符。
非贪婪匹配表达式:a.*?b解释:这个正则表达式会匹配第一个出现的“b”之前的所有“a”。
点号(.)表示任何字符,星号(*)表示前面的元素可以重复0次或多次,问号(?)表示非贪婪匹配,也就是说它会尽可能少地匹配字符。
所以,这个正则表达式会匹配从第一个“a”到第一个“b”之间的所有字符。
特殊字符表达式:\d解释:这个正则表达式会匹配任何数字。
反斜杠(\)是一个转义字符,所以\d表示数字。
类似的,还有例如\w(匹配任何字母、数字或下划线),\s(匹配任何空白字符),等等。
数量词表达式:a{3,5}解释:这个正则表达式会匹配3个、4个或5个连续的“a”。
大括号表示数量词,它可以指定前面的元素必须出现的次数范围。
锚点表达式:^abc$解释:这个正则表达式只会匹配整个字符串“abc”。
脱字符(^)表示字符串的开始,美元符号($)表示字符串的结束。
所以这个正则表达式只会匹配一个只包含“abc”的字符串。
修饰符表达式:/i(在某些语言中)解释:这个修饰符使匹配对大小写不敏感。
unicloud jql 正则表达式unicloud jql 正则表达式详解在unicloud平台上,使用JQL(JavaScript Query Language)可以对云数据库中的数据进行查询和筛选。
正则表达式(Regular Expression)是一种强大的字符串匹配工具,通过定义模式来匹配和查找符合要求的字符串。
本文将结合unicloud jql,详细介绍正则表达式的使用方法。
一、正则表达式基础正则表达式由普通字符(例如字母、数字和符号)和元字符(用于描述特殊模式)组成。
常用的元字符包括:1. 点号(.):匹配任意字符,但不包括换行符;2. 星号(*):匹配前面的字符出现0次或多次;3. 加号(+):匹配前面的字符出现1次或多次;4. 问号(?):匹配前面的字符出现0次或1次;5. 转义字符(\):用于转义元字符,使其失去特殊意义;6. 方括号([]):匹配方括号内的任意一个字符;7. 花括号({}):限定符,用于指定匹配的次数;8. 圆括号(()):分组,将一组字符视为一个整体。
二、unicloud jql中的正则表达式应用在unicloud jql中,可以使用正则表达式对数据进行模糊匹配和高级筛选。
以下是一些常用的正则表达式示例:1. 匹配以特定字符开头的字符串^abc:匹配以abc开头的字符串。
2. 匹配以特定字符结尾的字符串xyz$:匹配以xyz结尾的字符串。
3. 匹配特定字符出现的次数a{3}:匹配连续出现3个a的字符串。
4. 匹配特定字符出现的次数范围a{2,4}:匹配连续出现2到4个a的字符串。
5. 匹配任意字符.:匹配任意一个字符。
6. 匹配多个字符中的任意一个[a-z]:匹配小写字母。
7. 匹配特定字符集合[abc]:匹配a、b或c中的任意一个字符。
8. 排除特定字符集合[^abc]:匹配除了a、b和c之外的任意字符。
9. 匹配连续出现的字符\w:匹配任意一个字母、数字或下划线。
正则表达式语法详解正则表达式是一种用来描述和匹配文本模式的工具,是许多编程语言的重要特性之一。
正则表达式语法的设计旨在使用户能够轻松地描述复杂的文本模式,并且可以用于各种应用中,如文本搜索、文本替换、数据验证等。
本文将深入探讨正则表达式语法的细节与应用。
一. 基本语法正则表达式是由一系列字符和非特殊字符组成的模式。
其中最常用的是字面量字符,它们只匹配与其自身完全相同的文本。
例如,正则表达式`/abc/`只匹配字符串"abc"这个短语,它不会匹配其他任何文本。
除了字面量字符外,正则表达式还可以包含特殊字符和元字符。
特殊字符和元字符用来描述匹配特定模式的文本。
例如,正则表达式`/\d+/`匹配一个或多个数字字符,正则表达式`/[a-z]*ing/`匹配以"ing"结尾的任何单词,并且以任意小写字母开头。
在正则表达式语法中,还有一些特定的符号和结构用来描述复杂的文本模式,如字符类、重复次数限定符、分组和反向引用等。
二. 字符类字符类用来描述匹配特定类型字符的文本,可以用一对方括号"[ ]"表示。
例如,正则表达式`/[aeiou]/`匹配任何一个元音字符,正则表达式`/[0-9]/`匹配任何一个数字字符。
字符类还可以用一些特殊符号来定义,例如,正则表达式`/[^0-9]/`表示不匹配任何数字字符。
下面是字符类中常用的符号:- [abc]匹配a、b、c中的任何一个字符。
- [^abc]匹配不是a、b、c中的任何一个字符。
- [a-z]匹配任何小写字母。
- [A-Z]匹配任何大写字母。
- [0-9]匹配任何数字字符。
- [^a-z]匹配不是小写字母的任何字符。
三. 重复次数限定符重复次数限定符用来描述匹配特定字符或模式的重复次数。
例如,正则表达式`/a*/`匹配零个或多个字符"a",正则表达式`/a+/`匹配一个或多个字符"a"。
python正则表达式详解Python正则表达式详解正则表达式是一种强大的文本处理工具,它可以用来匹配、查找、替换文本中的特定模式。
在Python中,正则表达式是通过re模块来实现的。
本文将详细介绍Python中正则表达式的使用方法。
一、基本语法正则表达式是由一些特殊字符和普通字符组成的字符串。
其中,特殊字符用来表示一些特定的模式,普通字符则表示普通的文本。
下面是一些常用的正则表达式特殊字符:1. ^:匹配字符串的开头。
2. $:匹配字符串的结尾。
3. .:匹配任意一个字符。
4. *:匹配前面的字符出现0次或多次。
5. +:匹配前面的字符出现1次或多次。
6. ?:匹配前面的字符出现0次或1次。
7. []:匹配方括号中的任意一个字符。
8. [^]:匹配不在方括号中的任意一个字符。
9. ():将括号中的内容作为一个整体进行匹配。
10. |:匹配左右两边任意一个表达式。
二、常用函数Python中re模块提供了一些常用的函数来操作正则表达式,下面是一些常用的函数:1. re.match(pattern, string, flags=0):从字符串的开头开始匹配,如果匹配成功则返回一个匹配对象,否则返回None。
2. re.search(pattern, string, flags=0):在字符串中查找第一个匹配成功的子串,如果匹配成功则返回一个匹配对象,否则返回None。
3. re.findall(pattern, string, flags=0):在字符串中查找所有匹配成功的子串,返回一个列表。
4. re.sub(pattern, repl, string, count=0, flags=0):将字符串中所有匹配成功的子串替换为repl,返回替换后的字符串。
三、实例演示下面是一些实例演示,展示了正则表达式的使用方法:1. 匹配邮箱地址import reemail='*************'pattern = r'\w+@\w+\.\w+' result = re.match(pattern, email) if result:print(result.group())else:print('匹配失败')2. 匹配手机号码import rephone='138****5678' pattern = r'^1[3-9]\d{9}$' result = re.match(pattern, phone) if result:print(result.group())else:print('匹配失败')3. 查找所有数字import retext = 'abc123def456ghi789' pattern = r'\d+'result = re.findall(pattern, text)print(result)4. 替换字符串中的空格import retext = 'hello world'pattern = r'\s+'result = re.sub(pattern, '-', text)print(result)四、总结本文介绍了Python中正则表达式的基本语法和常用函数,并通过实例演示展示了正则表达式的使用方法。
正则表达式:两个或两个以上的空格正则表达式是一种用于匹配、查找和替换文本的模式。
在文本处理中,经常会遇到需要匹配空格的情况,而正则表达式则能够很好地解决这个问题。
本文将从浅入深,以“两个或两个以上的空格”为主题,探讨正则表达式的相关知识,并共享个人观点和理解。
1. 什么是正则表达式?正则表达式是一种用于描述、匹配、查找甚至替换字符串的模式。
它由普通字符(例如字母、数字)和特殊字符(称为元字符)组成。
在正则表达式中,空格通常表示为空格字符或者使用特殊元字符来表示。
接下来,我们将深入探讨如何使用正则表达式来匹配“两个或两个以上的空格”。
2. 匹配两个空格在正则表达式中,想要匹配两个空格,可以使用如下的模式:\s{2}。
其中,\s表示空白字符(包括空格、制表符和换行符),{2}表示匹配前面的元素两次。
\s{2}表示匹配两个连续的空白字符。
3. 匹配两个以上的空格如果想要匹配两个以上的空格,可以使用如下的模式:\s{2,}。
其中,{2,}表示匹配前面的元素至少两次。
\s{2,}表示匹配至少两个连续的空白字符。
4. 应用举例举个简单的例子来说明上述的正则表达式如何应用于真实的文本匹配。
假设我们有一段文本:“Hello world”,那么正则表达式\s{2}将匹配到“Hello world”中的两个空格;而正则表达式\s{2,}将匹配到“Hello world”中的两个以上的空格。
5. 总结与回顾通过本文的介绍,我们了解了如何使用正则表达式来匹配“两个或两个以上的空格”。
正则表达式能够帮助我们很好地处理文本中的空格,提高文本处理的效率。
使用正则表达式也需要结合实际情况进行灵活运用,以达到最佳的匹配效果。
6. 个人观点与理解我个人认为,正则表达式是文本处理中非常有用的工具之一。
对于匹配空格这样的简单任务,正则表达式能够快速、准确地完成。
但是需要注意的是,正则表达式在复杂匹配时可能会变得复杂难懂,需要谨慎使用。
正则表达式是一种强大的文本匹配和处理工具,它可以在文本中进行复杂的匹配和替换操作。
无论是在编程语言中还是在各种文本处理工具中,正则表达式都扮演着重要的角色。
本文将为您详细介绍正则表达式的相关知识,包括基本语法、元字符、量词、分组、反向引用、预搜索等内容,帮助您深入了解和掌握正则表达式的用法和技巧。
一、正则表达式基础知识1.1 正则表达式概述正则表达式是一种用来描述、匹配一系列符合某个句法规则的字符串的表达式。
通过使用正则表达式,我们可以轻松地在文本中查找、替换符合特定模式的字符串,实现文本的快速处理和处理。
1.2 基本语法正则表达式的基本语法包括普通字符和特殊字符。
普通字符就是匹配其自身的字符,比如字母、数字、标点符号等;特殊字符则具有特殊的含义,比如"."匹配任意一个字符,"^"匹配字符串的开头,"$"匹配字符串的结尾等。
1.3 元字符元字符是正则表达式中具有特殊含义的字符,比如"."、"^"、"$"等。
通过使用元字符,我们可以实现更精确的匹配和替换操作。
二、正则表达式进阶技巧2.1 量词正则表达式中的量词用来指定匹配字符的数量,比如"*"表示零个或多个,"+"表示一个或多个,"?"表示零个或一个等。
通过使用量词,我们可以对文本中特定模式的字符串进行更精确的匹配。
2.2 分组正则表达式中的分组用来将多个字符组合成一个整体进行匹配,比如"(abc)"表示匹配"abc"这个字符串。
通过使用分组,我们可以更灵活地进行匹配和替换操作。
2.3 反向引用正则表达式中的反向引用用来引用前面匹配到的分组,比如"\1"表示引用第一个分组所匹配到的内容。
通过使用反向引用,我们可以实现一些复杂的匹配和替换操作。
c语言中的正则表达式C语言中的正则表达式正则表达式是一种强大的模式匹配工具,常用于字符串的匹配、查找和替换。
在C语言中,我们可以使用正则表达式库来实现对字符串的高效处理。
本文将介绍C语言中的正则表达式的基本语法和用法,并通过示例代码展示其在实际应用中的作用。
一、正则表达式的基本语法C语言中的正则表达式使用的是POSIX标准的正则表达式语法。
下面是一些常用的正则表达式元字符和操作符:1. 字符类- []:匹配方括号中的任意一个字符,例如[abc]可以匹配字符a、b或c。
- [^]:匹配除方括号中的字符以外的任意一个字符,例如[^abc]可以匹配除了a、b和c以外的任意字符。
- -:表示字符范围,例如[a-z]表示匹配任意小写字母。
2. 重复次数- *:匹配前面的表达式零次或多次。
- +:匹配前面的表达式一次或多次。
- ?:匹配前面的表达式零次或一次。
- {n}:匹配前面的表达式恰好n次。
- {n,}:匹配前面的表达式至少n次。
- {n,m}:匹配前面的表达式至少n次但不超过m次。
3. 特殊字符- .:匹配任意一个字符。
- \:转义字符,用于匹配特殊字符本身,例如\.匹配点字符。
- ^:匹配行的开始位置。
- $:匹配行的结束位置。
二、C语言中的正则表达式库在C语言中,我们可以使用正则表达式库来实现对字符串的匹配、查找和替换。
常用的正则表达式库有POSIX标准库和PCRE库。
1. POSIX标准库POSIX标准库提供了一系列函数来处理正则表达式,包括编译正则表达式、执行匹配和释放资源等。
常用的函数有:- regcomp:编译正则表达式。
- regexec:执行正则表达式匹配。
- regfree:释放已编译的正则表达式。
下面是一个使用POSIX标准库的示例代码:```c#include <regex.h>#include <stdio.h>int main() {regex_t regex;int ret;// 编译正则表达式ret = regcomp(®ex, "a.*b", REG_EXTENDED); if (ret != 0) {printf("正则表达式编译失败\n");return -1;}// 执行匹配ret = regexec(®ex, "abc", 0, NULL, 0);if (ret == 0) {printf("匹配成功\n");} else if (ret == REG_NOMATCH) {printf("未匹配到结果\n");} else {printf("匹配失败\n");}// 释放资源regfree(®ex);return 0;}```2. PCRE库PCRE库是Perl Compatible Regular Expressions的缩写,是一个功能强大的正则表达式库,提供了更多的特性和功能。
vba正则表达式详解VBA正则表达式详解正则表达式是一种强大的文本处理工具,可以帮助我们在VBA编程中进行高效的文本匹配和替换操作。
通过使用正则表达式,我们可以轻松地实现复杂的文本处理任务,提高编程效率。
本文将详细介绍VBA中正则表达式的使用方法和常见应用场景。
一、正则表达式的基本概念正则表达式是一种描述文本模式的语法,通过使用特定的符号和规则,我们可以定义出需要匹配的文本模式。
正则表达式可以用来验证输入的合法性、搜索和替换特定的文本,以及提取出符合特定模式的文本等。
二、VBA中的正则表达式对象在VBA中,我们可以通过创建正则表达式对象来使用正则表达式。
VBA提供了一个名为"RegExp"的对象,通过创建该对象,我们可以使用正则表达式进行文本处理操作。
三、VBA中的正则表达式函数VBA提供了一系列函数来支持正则表达式的使用,常用的函数有:1. CreateObject:用于创建正则表达式对象。
2. Pattern:用于设置正则表达式的模式。
3. Test:用于判断一个字符串是否符合正则表达式的模式。
4. Replace:用于替换字符串中符合正则表达式模式的部分。
5. Execute:用于在字符串中查找符合正则表达式模式的部分。
四、正则表达式的基本语法1. 字符匹配:使用普通字符来匹配文本中的字符。
例如,正则表达式"a"可以匹配字符串中的"a"字符。
2. 字符类:使用方括号来定义一个字符类,字符类中的任意一个字符都可以匹配。
例如,正则表达式"[abc]"可以匹配字符串中的"a"、"b"或"c"字符。
3. 量词:用于指定匹配的次数。
例如,"*"表示匹配0次或多次,"+"表示匹配1次或多次,"?"表示匹配0次或1次。
stl 正则表达式详解STL正则表达式是一种用于处理字符串的模式匹配工具,它提供了一组强大的函数和类,用于在字符串中查找、匹配和操作模式。
正则表达式是一种特殊的字符串模式,用于描述一组字符串的规则。
它可以用来匹配、查找、替换和分割字符串。
在STL正则表达式中,使用`std::regex`类来表示正则表达式,使用`std::regex_match`、`std::regex_search`、`std::regex_replace`等函数来进行模式匹配、查找和替换操作。
下面是一些STL正则表达式的常见用法:1. `std::regex_match`: 该函数用于判断整个字符串是否与正则表达式匹配。
如果整个字符串与正则表达式完全匹配,则返回true;否则返回false。
示例代码:```cppstd::string s = "Hello, world!";std::regex e ("\\w+"); // 匹配单词字符if (std::regex_match (s, e)) {std::cout << "String matches the pattern.\n";} else {std::cout << "String does not match the pattern.\n";}```2. `std::regex_search`: 该函数用于在字符串中查找与正则表达式匹配的子串。
如果找到了匹配的子串,则返回true;否则返回false。
示例代码:```cppstd::string s = "Hello, world!";std::regex e ("\\w+"); // 匹配单词字符if (std::regex_search (s, e)) {std::cout << "Substring matches the pattern.\n";} else {std::cout << "Substring does not match the pattern.\n";```3. `std::regex_replace`: 该函数用于将字符串中与正则表达式匹配的部分替换为指定的字符串。
Java正则表达式详解仙人掌工作室01-7-31 下午04:13:03如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单。
如果你不熟悉这个术语,那么“正则表达式”(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式。
许多语言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级“搜索-替换”功能。
那么Java又怎样呢?本文写作时,一个包含了用正则表达式进行文本处理的Java规范需求(Specification Request)已经得到认可,你可以期待在JDK的下一版本中看到它。
然而,如果现在就需要使用正则表达式,又该怎么办呢?你可以从下载源代码开放的Jakarta-ORO库。
本文接下来的内容先简要地介绍正则表达式的入门知识,然后以Jakarta-ORO API为例介绍如何使用正则表达式。
一、正则表达式基础知识我们先从简单的开始。
假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。
如果搜索对大小写不敏感,单词“catalog”、“Catherine”、“sophisticated”都可以匹配。
也就是说:1.1 句点符号假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。
另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。
要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。
这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“t n”,还有其他许多无意义的组合。
这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符:1.2 方括号符号为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。
此时,只有方括号里面指定的字符才参与匹配。
也就是说,正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。
但“Toon”不匹配,因为在方括号之内你只能匹配单个字符:1.3 “或”符号如果除了上面匹配的所有单词之外,你还想要匹配“toon”,那么,你可以使用“|”操作符。
“|”操作符的基本意义就是“或”运算。
要匹配“toon”,使用“t(a|e|i|o|oo)n”正则表达式。
这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号“()”。
圆括号还可以用来分组,具体请参见后面介绍。
1.4 表示匹配次数的符号表一显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数:假设我们要在文本文件中搜索美国的社会安全号码。
这个号码的格式是999-99-9999。
用来匹配它的正则表达式如图一所示。
在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从0到9。
因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“\”。
图一:匹配所有123-12-1234形式的社会安全号码假设进行搜索的时候,你希望连字符号可以出现,也可以不出现——即,999-99-9999和999999999都属于正确的格式。
这时,你可以在连字符号后面加上“?”数量限定符号,如图二所示:图二:匹配所有123-12-1234和123121234形式的社会安全号码下面我们再来看另外一个例子。
美国汽车牌照的一种格式是四个数字加上二个字母。
它的正则表达式前面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。
图三显示了完整的正则表达式。
图三:匹配典型的美国汽车牌照号码,如8836KV1.5 “否”符号“^”符号称为“否”符号。
如果用在方括号内,“^”表示不想要匹配的字符。
例如,图四的正则表达式匹配所有单词,但以“X”字母开头的单词除外。
图四:匹配所有单词,但“X”开头的除外1.6 圆括号和空白符号假设要从格式为“June 26, 1951”的生日日期中提取出月份部分,用来匹配该日期的正则表达式可以如图五所示:图五:匹配所有Moth DD,YYYY格式的日期新出现的“\s”符号是空白符号,匹配所有的空白字符,包括Tab字符。
如果字符串正确匹配,接下来如何提取出月份部分呢?只需在月份周围加上一个圆括号创建一个组,然后用ORO API(本文后面详细讨论)提取出它的值。
修改后的正则表达式如图六所示:图六:匹配所有Month DD,YYYY格式的日期,定义月份值为第一个组1.7 其它符号为简便起见,你可以使用一些为常见正则表达式创建的快捷符号。
如表二所示:表二:常用符号例如,在前面社会安全号码的例子中,所有出现“[0-9]”的地方我们都可以使用“\d”。
修改后的正则表达式如图七所示:图七:匹配所有123-12-1234格式的社会安全号码二、Jakarta-ORO库有许多源代码开放的正则表达式库可供Java程序员使用,而且它们中的许多支持Perl 5兼容的正则表达式语法。
我在这里选用的是Jakarta-ORO正则表达式库,它是最全面的正则表达式API 之一,而且它与Perl 5正则表达式完全兼容。
另外,它也是优化得最好的API之一。
Jakarta-ORO库以前叫做OROMatcher,Daniel Savarese大方地把它赠送给了Jakarta Project。
你可以按照本文最后参考资源的说明下载它。
我首先将简要介绍使用Jakarta-ORO库时你必须创建和访问的对象,然后介绍如何使用Jakarta-ORO API。
▲ 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接口的一个实现,它根据Perl 5正则表达式语法进行模式匹配:使用PatternMatcher对象,你可以用多个方法进行匹配操作,这些方法的第一个参数都是需要根据正则表达式进行匹配的字符串:· boolean matches(String input, Pattern pattern):当输入字符串和正则表达式要精确匹配时使用。
换句话说,正则表达式必须完整地描述输入字符串。
· boolean matchesPrefix(String input, Pattern pattern):当正则表达式匹配输入字符串起始部分时使用。
· boolean contains(String input, Pattern pattern):当正则表达式要匹配输入字符串的一部分时使用(即,它必须是一个子串)。
另外,在上面三个方法调用中,你还可以用PatternMatcherInput对象作为参数替代String 对象;这时,你可以从字符串中最后一次匹配的位置开始继续进行匹配。
当字符串可能有多个子串匹配给定的正则表达式时,用PatternMatcherInput对象作为参数就很有用了。
用PatternMatcherInput对象作为参数替代String时,上述三个方法的语法如下:· boolean matches(PatternMatcherInput input, Pattern pattern)· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)· boolean contains(PatternMatcherInput input, Pattern pattern)三、应用实例下面我们来看看Jakarta-ORO库的一些应用实例。
3.1 日志文件处理任务:分析一个Web服务器日志文件,确定每一个用户花在网站上的时间。
在典型的BEA WebLogic日志文件中,日志记录的格式如下:分析这个日志记录,可以发现,要从这个日志文件提取的内容有两项:IP地址和页面访问时间。
你可以用分组符号(圆括号)从日志记录提取出IP地址和时间标记。
首先我们来看看IP地址。
IP地址有4个字节构成,每一个字节的值在0到255之间,各个字节通过一个句点分隔。
因此,IP地址中的每一个字节有至少一个、最多三个数字。
图八显示了为IP地址编写的正则表达式:图八:匹配IP地址IP地址中的句点字符必须进行转义处理(前面加上“\”),因为IP地址中的句点具有它本来的含义,而不是采用正则表达式语法中的特殊含义。
句点在正则表达式中的特殊含义本文前面已经介绍。
日志记录的时间部分由一对方括号包围。
你可以按照如下思路提取出方括号里面的所有内容:首先搜索起始方括号字符(“[”),提取出所有不超过结束方括号字符(“]”)的内容,向前寻找直至找到结束方括号字符。
图九显示了这部分的正则表达式。
图九:匹配至少一个字符,直至找到“]”现在,把上述两个正则表达式加上分组符号(圆括号)后合并成单个表达式,这样就可以从日志记录提取出IP地址和时间。
注意,为了匹配“- -”(但不提取它),正则表达式中间加入了“\s-\s-\s”。
完整的正则表达式如图十所示。
图十:匹配IP地址和时间标记现在正则表达式已经编写完毕,接下来可以编写使用正则表达式库的Java代码了。
为使用Jakarta-ORO库,首先创建正则表达式字符串和待分析的日志记录字符串:这里使用的正则表达式与图十的正则表达式差不多完全相同,但有一点例外:在Java中,你必须对每一个向前的斜杠(“\”)进行转义处理。