[java] 汇率换算器实现-插曲1-正则表达式(1)(二)

2014-11-23 21:43:38 · 作者: · 浏览: 17
anything not \s
\w -> [a-zA-Z0-9_] (useful as in \w+, ostensibly to match a word)
\W -> anything not \w
\d -> [0-9]
\D -> anything not \d
\b -> 位置匹配, start of word and end of word
( : ) -> the matched is not added to group
( = ) -> 位置匹配, lookahead (toward the right), the subregex comes next
( ! ) -> 位置匹配, successful if can not match to the left
( <= ) -> 位置匹配, lookbehind (toward the left), this position is after the subregex
( 位置匹配, successful if can not match to the right
m/../i -> i means case-insensitive
5.5 匹配后进行替换
usage: s/regex/replacement/
for example: $var =~ s/\bJeff\b/Jeffrey/i; # 将Jeff单词替换为Jeffrey, 并且不区分大小写
for example: $var =~ s/\bJeff\b/Jeffrey/g; # g means将$var中出现的所有Jeff单词都替换为Jeffrey
下面给出一个问题, 如果某些导出的文件中的数字是很多位的, 如8.235897920, 这样并不方便读者进行 阅读, 那么如何通过匹配以及替换的方式将多位小数转变位适当位数的小数呢, 如两位.
number regex: (\.\d\d) \d*
implement: $price =~ s/(\.\d\d) \d*/$1/g
5.6 一些例子
5.6.1 位置信息匹配
仅匹配特殊字符的一部分, 如仅匹配Jeffrey中的Jeff, 而不匹配单纯的Jeff
( =Jeffrey)Jeff, ( =Jeffrey)用来确定确实存在Jeffrey, 并指定J前的位置.
并且位置信息的匹配要在具体内容匹配之前, 也就是说regex: Jeff( =Jeffrey), 不能实现上述的匹配
将漏加的"'"添加上, 如本来应该是Jame's, 却写成了James, 用下面几种方式进行实现:
s/\bJames\b/Jame's/g
s/\bJeff( =s\b)/Jeff'/g
s/( <=\bJame)( =s\b)/'/g
在一长整数中添加分隔的逗号, 使得数字更加易读. 如, 123456789, 改成1,2345,6789
s/( <=\d)( =(\d{4})+\b)/,/g; # ( <=\d) 说明添加逗号的位置的左边必须有个数字
# ( =(\d{4})+\b) 说明从单词的边界开始往左边数, 每隔4个数字, 添加一个逗号
5.6.2 文本文档转换为 html格式
undef $/;
$text = <>;
$text =~ s/&/&/g; # make the basic html...
$text =~ s/...
$text =~ s/>/>/g; # ...HTML safe.
# 下面使用了perl正则表达式中一个神奇的字符/m
# 在一般情况下^, 和 $表达的意思如下:
# ^: 匹配一个变量的第一个位置
# $: 匹配一个变量的最后一个位置
# 加了一个/m后, ^和$表示的意思将发生变化:
# ^: 匹配一行的第一个位置
# $: 匹配一行的最后一个位置
# 而$text变量的内容为: 一行内容+换行符+加下一行内容+...
# 因此想要将每一空行转变为

需用/m

$text =~ s/^\s*$/

/mg; # 将空行转变为

# 将email地址转变成links
# 这里使用了另一种书写方式s{regex}{replacement}gix
# 此时regex中可以使用空格, 注释语言使得regex更加的易读
# 结尾x的作用是忽略regex中多余的空格符,
# 值得注意的是, 它并不能忽略replacement中的空格项
$text =~ s{
\b
# Capture the address to $1
(
\w[-.\w]* # 用户名匹配, \w = [a-zA-Z0-9_]
\@ # 由于@在perl语言中有其他意思, 因此需要用转义字符进行转换
[-a-z0-9]+(\.[-a-z0-9]+)*\.(com|edu|info|others) # 域名, 此处others表示其他类似com, edu的内容
)
\b
}{$1}gix;
# Turn HTTP URLs into links ...
$text =~ s{
\b
(
http:// [-a-z0-9]+(\.[-a-z0-9]+)*\.(com|edu|others) \b # hostname
(
/ [-a-z0-9_:\@& =+,.!/~*'%\$]* # 可选择的路径
(
)
)
}{$1}gix;
print $text;
5.7 一些元字符的缩写
https://www.cppentry.com/upload_files/article/76/1_thh30__.jpg
一些元字符的缩写
5.8 Excape Character, 转义字符
转义字符标志着一个字符序列中出现在它之后的后续几个字符采取一种替代解释.
https://www.cppentry.com/upload_files/article/76/1_imcoz__.jpg
5.9 字符类和字符类相似的结构
5.9.1 常见字符集合: [a-z] and [^a-z]
一般在8位的 系统中, [^LMNOP]表示的意思为[\x00-KQ-\xFF], 但是字符系统为Unicode的时候, 最大值将会超出\xFF, 此时它表示的范围将包括出了LMNOP以外的所有字符(the tens of thousands).
5.9.2 dot字符
一般表示匹配除了换行符以外的所有字符. 以下情况需要注意:
在某些的Unicode字符系统中, 如java regex package, dot一般不匹配unicode的行结尾字符
在match mode, 它的含意会发生变化
在基于POSIX标准的语言中, 并不匹配NUL, 尽管主流的脚本语言都允许在文本中出现NULLs, 并且能够匹配它们.
5.9.3 结合字符序列的Unicode: \X
\X支持匹配由多个Unicode编码组成的字符, 并且能够匹配换行符和其他Unicode行结尾符. 类似与".".
5.9.4 字符集缩写
\d: 数字[0-9], 在一些Unicode工具中为所有的Unicode数字
\D: [^\d]
\w: [0-9a-zA-Z_], 在某些工具中没有包括下划线. 如果, 支持unicode, \w通常表示为