正则
第一条评论有链接指向 阿星Plus
写的正则文章,比我这个要清楚,建议看一下
正则表达式相关的内容自己都不记得看了几次了,每次看完没多久便忘记了,昨日恰巧看到了一段数字转中文大写的代码,一大串表达式写在那看的我只能发呆,便又看了一遍正则相关内容,为加深印象做个笔记记录一下。下面是我所看到的代码
//输入34548567.23为例
public static string ConvertToChinese(string money)
{
if(!double.TryParse(money,out double x))
return string.Empty;
//s = LEDCKEDCJEDCIEDCHEDCG3E4D5C4F8E5D6C7.2B3A
// L千百拾K千百拾J千百拾I千百拾H千百拾G3千4百5拾4F8千5百6拾7.2B3A
string s = x.ToString("#L#E#D#C#K#E#D#C#J#E#D#C#I#E#D#C#H#E#D#C#G#E#D#C#F#E#D#C#.0B0A");
//d = 3E4D5C4F8E5D6C7.2B3A
string d = Regex.Replace(s,@"((?<=-|^)[^1-9]*)|((?'z'0)[0A-E]*((?=[1-9])|(?'-z'(?=[F-L\.]|$))))|((?'b'[F-L])(?'z'0)[0A-L]*((?=[1-9])|(?'-z'(?=[\.]|$))))", "${b}${z}");
//r = 叁仟肆佰伍拾肆万捌仟伍佰陆拾柒元贰角叁分
string r = Regex.Replace(d, ".", m => "负元空零壹贰叁肆伍陆柒捌玖空空空空空空空分角拾佰仟万亿兆京垓秭穰"[m.Value[0] - '-'].ToString());
if (!string.IsNullOrWhiteSpace(d))
r = r + (d.Reverse().Take(1).ToArray()[0] == '.' ? "整" : string.Empty);
return r;
}
正则里面的符号
1、^,$
^ 用于匹配字符串的开始位置,当用在方括号中时表示排除方括号中的字符。
例: ^[1-9]+ 匹配1-9开头的数字
[^0-9]+ 匹配非数字字符
$ 用于匹配字符串的结束位置
2、\,|
\ 是转义字符
|表示‘或'符号
3、. 匹配换行符 \n之外的任何字符
4、(),[],{}
()用来标记子表达式的开始
[]用来标记中括号表达式的开始
{}标记限定符表达式的开始
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 ***** 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。
圆括号()有一个副作用,会使相关的匹配被缓存,可将 ?:放在第一个选项前来消除副作用。
?:?=?!为非捕获元,后续会有说明
5、*,+,?
* 表示前面的子表达式出现零次或多次(有没有随意 )
+ 表示前面的子表达式出现一次或多次(最少要有一次)
? 表示前面的子表达式出现零次或一次(最多出现一次)
其中。*,+限定符是贪婪的,可以在他们后面跟? 实现非贪婪
6、 {n},{n,},{n,m}
{n},n为非负整数,匹配确定的n次
{n,},n为非负整数,至少匹配n次
{n,m},n,m均为非负整数,匹配n到m次,n <= m
{0,} => * ;{1,} => +;{0,1} => ?;
7、?:
匹配表达式但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。
这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。
例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。
摘自菜鸟教程
8、(?=表达式),(?!表达式),(?<=表达式),(?<!表达式),
?= 正向肯定预查,在任何匹配表达式的字符串开始处匹配查找字符串
?!正向否定预查,在任何不匹配表达式的字符串开始处匹配查找字符串
教程给出示例如下:
"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。
Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows“。
自己借用Notepad++的正则表达式匹配搜索验证(匹配项蓝色显示)如下:
"中国(?=人)" 能匹配 ”中国人法国人中国人人中国美国人人人“
"(?=中国人).." 能匹配 ”中国人法国人中国人人中国美国人人人“
"中国(?!人)" 能匹配 ”中国人法国人中国人人中国美国人人人“
(?!中国人).."能匹配到8次,如下所列:国人,法国,人中,国人,人中,国美,国人,人人
?<=反向肯定预查,与正向肯定查询相似,只是方向相反
?<!反向否定预查,与正向肯定查询相似,只是方向相反
教程给出示例如下:
"
(?<=95|98|NT|2000)Windows
"能匹配"2000Windows
"中的"Windows
",但不能匹配"3.1Windows
"中的"Windows
"。"
(?<!95|98|NT|2000)Windows
"能匹配"3.1Windows
"中的"Windows
",但不能匹配"2000Windows
"中的"Windows
"。自己借用Notepad++的正则表达式匹配搜索验证(匹配项蓝色显示)如下:
"(?<=中国)人" 能匹配 ”中国人法国人中国人人中国美国人人人“
"(?<!中国)人" 能匹配 ”中国人法国人中国人人中国美国人人人“
(?=xox) 和 (?<=xox) 的区别:
可以看作此两者是匹配字符之间的一个虚无的 “空位”。
(?=xox) 匹配 xox 之前的空位,而 (?<=xox) 匹配 xox 之后的空位。
所以对于 abxoxcd:
(?=xox).. 匹配 xo ..(?=xox) 匹配 ab (?<=xox).. 匹配 cd ..(?<=xox) 匹配 ox
特殊含义的字符
1、\f 匹配换页符,\n 匹配换行符, \r 匹配回车符, \t 匹配制表符,\v 匹配垂直制表符
2、\b 匹配一个单词边界;\B匹配非单词边界
3、\s 匹配任何空白字符,等价于 [ \f\n\r\t\v]; \S匹配任何非空白字符。
4、\d匹配一个数字字符;\D匹配非数字字符
5、\w匹配字母数字下划线,等价于'[A-Za-z0-9_]';\W匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'。
6、\num匹配一个num,num是一个正整数,获取匹配缓存的引用。
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符 ?:、?= 或 ?! 来重写捕获,忽略对相关匹配的保存。
例 :
var str = "Is is the cost of of gasoline going upup"; var pattern = /\b([a-z]+) \1\b/ig; document.write(str.match(pattern));
表达式中的 \1 即是引用“([a-z]+)” 的结果,该示例用于查找字符串内的相同单词,其中 i 代表忽略大小写,
g 指定将该表达式应用到输入字符串中能够查找到的尽可能多的匹配
分解URI的示例更为清晰,可百度了解。
本文只是简单总结了一下正则的一些基本知识,并没有太多具体应用示例。
回头再看代码里的正则,嗯,还是看不懂,难搞哟。