正则表达式笔记:提取C#代码中的中文信息,双引号,尖括号间的信息
1.重复的表标记
* 表示前面的字符要出现0次,1次,乃至多次,上面没有封顶, 下面保底是0次,可以不出现。
+ 表示前面的字符要出现1次,多次,上面没有封顶,但至少要有1次。
? 表示前面的字符要出现0次,1次,上面封顶是1次,下面保底是0次,可以不出现。
2.其他符号
\ 表示转义
. 表示匹配任何单个字符,好象除了回车,记不清了,得查一下文档。
^ 表示整个字符串以某字符开始,如^t,整个字符串这句话很重要,它只能是位于开头。
$ 表示整个字符串以某字符结束,如f$,整个字符串这句话很重要,它只能是位于结尾。
[...] 表示括号中的任一字符
| 表示选择符号,"gray|grey"可匹配 gray 或 grey.
() 表示操作的范围和优先度, 如 "gr(a|e)y" 可以匹配 gray 或 grey.
{n} 匹配前面字符n次, {n,} n次或无限次, {n,m} 最少n次最多m次。
\s 任一空白字符
\S 任一非空白字符
\w 任一单词字符
\W 任一非单词字符
\d 任一数字
\D 任一非数字
3.提取中文信息的表达式。
Regex rx = new Regex("[\u4e00-\u9fa5]+");
4.提取双引号之间的信息的表达式。
Regex rx = new Regex("\"[^\"]*\"");
注解:在[]中的^意思变了,不再是以某字符开始了,而是变为不能包含后面的字符了,这叫反义。
5.反义
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:
表3.常用的反义代码
代码/语法 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou]
匹配除了aeiou这几个字母以外的任意字符
6.提取双引号之间的信息的表达式,第二种方法。
Regex rx = new Regex("\".*?\"");
注解: 在.*之后加一个?的作用是将正则表达式从贪婪模式改为懒惰模式。
7.贪婪与懒惰
当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。考虑这个表达式:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。现在看看懒惰版的例子吧:
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab(第四到第五个字符)。
为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?简单地说,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权——The match that begins earliest wins。
8.另外,蓝驿轨迹还有一种匹配双引号的方法,就是把引号转成16进制数,具体请参考:http://www.cnblogs.com/twh/articles/1629752.html
Regex rx = new Regex("\u0022.*?\u0022");
9.提取xml配置文件中包含中文的信息,用于国际化代码。
有可能在两种地方出现包含中文的信息,属性和节点值,因此,可以用双引号匹配一次文件,提取出属性值中包含的中文信息;然后,再用尖括号匹配一次文件,提取出节点值中包含的中文信息,正则 rx = new Regex(">.*<");
如果仅仅是匹配中文,用Regex rx = new Regex("[\u4e00-\u9fa5]+")即可,但如果中文中间夹杂着标点符号或者英文,那用这个就不灵了,可以换个思路,用IsMatch来判断信息中是否包含中文来达到取舍的目的,示例如下:
Regex rxChinaCharacter= new Regex("[\u4e00-\u9fa5]+")
Regex rx = new Regex(">.*<");
System.Text.RegularExpressions.MatchCollectionmatchs = rx.Matches(input);
if (matchs.Count != 0)
{
foreach (Match m in matchs)
{
if (!rxChinaCharacter.IsMatch(m.Value)){
//符合包含中文的条件条件,可以留下来。
}
}
}
10.总结
^有两种含义:
1.表示整个字符串以某字符开始,如^t,整个字符串这句话很重要,它只能是位于开头。
2.放在[^t]里表示不能包含t字符。
?也有两种含义:
1.表示前面的字符要出现0次,1次,上面封顶是1次,下面保底是0次,可以不出现。
2.将正则从贪婪模式改为懒惰模式。
$ 表示整个字符串以某字符结束,如f$,整个字符串这句话很重要,它只能是位于结尾,如assssbtattttb这个串让 a[^a]*b$ 来匹配,就只能匹配后半截attttb, 如用^ a[^a]*b, 就只能匹配前半段assssb, 如果用^ a[^a]*b$来匹配,则根本什么都匹配不了。
推荐资料:
正则表达式30分钟入门教程http://manual.phpv.net/regular_expression.html
C#正则表达式整理备忘
http://www.cnblogs.com/kissknife/archive/2008/03/23/1118423.html
正则表达式怎么匹配双引号
http://www.cnblogs.com/twh/articles/1629752.html
邮箱:lzd_ren@hotmail.com
出处:http://www.cnblogs.com/liuzhendong
本文版权归作者所有,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。