Table of Contents
1 系列文章地址
2 前言
3 什么是正则表达式
4 正则表达式的初步运用–egrep
4.1 egrep支持的正则表达式的语法
4.2 举例说明
5 正则表达式更复杂的运用–perl
5.1 perl简单用法
5.2 简单的字符匹配
5.3 获取匹配后的内容
5.4 常用特殊字符, 匹配等
5.5 匹配后进行替换
5.6 一些例子
5.6.1 位置信息匹配
5.6.2 文本文档转换为html格式
5.7 一些元字符的缩写
5.8 Excape Character, 转义字符
5.9 字符类和字符类相似的结构
5.9.1 常见字符集合: [a-z] and [^a-z]
5.9.2 dot字符
5.9.3 结合字符序列的Unicode: \X
5.9.4 字符集缩写
5.9.5 Unicode特性, 字符系统, 区块
5.10 位置信息匹配
5.10.1 一行或是字符串开始与结束的位置的匹配
5.10.2 上次匹配的后面的位置, 以及这次匹配开始的位置: \G
5.10.3 匹配字符边界
5.11 Grouping, Capturing, Conditionals, and Control
1 系列文章地址
java 汇率换算器的实现(1)
java 汇率换算器的实现(2)
2 前言
回顾一下, 在上篇文章种通过正则表达式的方式, 从网页中成功提取出了相应的汇率表的内容. 这篇文章就主要来介绍一下关于正则表达式的相关内容. 想要更为深入的了解, 请见Jeffrey的Mastering Regular Expressions .
3 什么是正则表达式
正则表达式作为计算机科学的一个概念, 可以使用单个字符串来描述, 匹配一系列符合某个句法规则的字符串. 正则表达式的基本语法可以在egrep的使用中了解, 更加复杂的用法就集成到了其他
编程语言中, 如perl, python, java, php等.
4 正则表达式的初步运用–egrep
4.1 egrep支持的正则表达式的语法
符号
simple discription
detail discription
.
点
匹配任何单个字符
[]
单字符集合
匹配任何列在里面的单个字符
[^…]
单字符的补集
匹配任何不在列表中的单个字符
{min, max}
匹配次数
至少匹配min次, 至多匹配max次
问号
{0, 1}
\(*\)
星号
{0,}
+
加号
{1,}
^
脱字号
匹配一行的开头
$
美元号
匹配一行的结尾
\\<
单词边界
匹配一个单词的开始边界
\\>
单词边界
匹配一个单词的结尾边界
vertical line
选择
匹配其中一个表达式
()
括号
限制选择匹配的范围, 给匹配结果一个相应的标识
\1
应用
应用由()匹配的结果
4.2 举例说明
匹配一句话中连续重复的单词, 其间由空格分隔
sentence in file.txt: Hello i am a a person, not a thing.
exe: egrep -i '([a-zA-Z]+)( +\1){1,}' file.txt
explane: -i 表示忽略大小写
匹配文中可能出现的输入错误的单词
sentence in file.txt: Teh month
exe: egrep -i '\<(hte|teh)\>' file.txt
匹配24小时制的时间
exe: egrep '([01] [0-9]|2[0-3]):[0-5][0-9]' tmp.txt
5 正则表达式更复杂的运用–perl
由于perl的使用不是本文的主题, 因此这里只是简略的说明下.
5.1 perl简单用法
# filename: temps
$celsius = 20; # 变量赋值
while ($celsius <= 45) # 循环结构
{
if ($celsius != 30) # 选择结构
{
$fahrenheit = ($celsius * 9/5) + 32; # 计算
print "$celsius C is $fahrenheit F. \n"; # 输出结果
$celsius = $celsius + 5;
}
}
perl temps
5.2 简单的字符匹配
print "Enter a temperature in Celsius:\n";
$celsius = ; # 用户输入
chomp($celsius); # 将结尾的换行符去掉
# 判断是否只有数字
if ($celsius =~ m/^[0-9]+$/) { # m means 尝试进行正则表达式匹配,
# =~ 说明正则表达式的对象是$reply
print "$celsius C\n";
} else {
print "not only digits\n";
}
又考虑到现实中, 温度的表示可以是负数, 小数, 因此, 正则表达式可以改为:
m/^[-+] [0-9]+(\.[0-9]+) $/
5.3 获取匹配后的内容
那么如何获取匹配后的内容呢 采用了()包围的方法, 如下:
print "Enter a temperature in Celsius:\n";
$celsius = ; # 用户输入
chomp($celsius); # 将结尾的换行符去掉
# 判断输入的格式是否为$number$space$unit
if ($celsius =~ m/^([-+] [0-9]+(\.[0-9]+)) *([Cc])$/) { # m means 尝试进行正则表达式匹配,
# 如果, $number和$unit之间还有可能包括tab, 那么判断语句改为下式
# if ($celsius =~ m/^([-+] [0-9]+(\.[0-9]+)) [ \t]*([Cc])$/) {
# =~ 说明正则表达式的对象是$reply
print "The number is $1, the unit is $3\n"; # group从左向右, 按照出现(的顺序进行编号
} else {
print "not matched\n";
}
上面的匹配行为中, 我们没有使用到$2, 那么有没有什么更好的方法将$2从group中排除掉, 量$3成为$2呢 可以采用符号( : ):
$celsius =~ m/^([-+] [0-9]+( :\.[0-9]*) )[ \t]*([Cc])$/
5.4 常用特殊字符, 匹配等
\t -> a tab character
\n -> a newline character
\r -> a carriage-return character
\s -> matches any "whitespace" character (space, tab, newline, formfeed, and such)
\S ->