字符串和正则表达式
一
、 System.String
类
复习前面知识
二、正则表达式
1、引入:在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
Windows/Dos下用于文件查找的通配符(wildcard)
,也就是*和?。如果你想查找某个目录下的所有的
Word文档的话,你会搜索*.doc。在这里,*会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求。
2、简单例子:
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string Pattern = @"hi";
string s = @"hi Hi THIS hI HI chAINA";
MatchCollection Matches = Regex.Matches(s, Pattern,RegexOptions.IgnoreCase);
foreach (Match NextMatch in Matches)
{
Console.WriteLine(NextMatch.ToString());
}
}
}
}
![正则表达式总结(一)正则表达式](/Files/20116/7b0d0e82-55d1-4b77-9c32-c935682c075c.jpg)
RegexOptions枚举选项:
查看MSDN
3、
主要得特定字符或转义序列
1)元字符
常用元字符:
![正则表达式总结(一)正则表达式](/Files/20116/caa37237-266c-42cf-bd7a-fcbdd27bf6e4.jpg)
\S
任何不是空白得字符
\B
不是字边界得位置
Eg:
i.ation
结果为isation iztion
\ba\w*\b
匹配以字母a
开头的单词,然后是任意数量的字母或数字(
\w*)
,最后是单词结束处(
\b)
。
\b\w{6}\b
匹配刚好6
个字母/
数字的单词。
\d+
匹配1
个或更多连续的数字。
\ba\S*ion\b ----------
表示以a
开头,中间为任意个不是空白的字符,以ion
结尾
元字符^(和数字6在同一个键位上的符号)和$都匹配一个位置,这和\b有点类似。^匹配你要用来查找的字符串的开头,$匹配结尾。这两个代码在验证输入的内容时非常有用,比如一个网站如果要求你填写的QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$。
2)字符转义
如果你想查找元字符本身的话就必须使用字符转义
C:\\Windows匹配C:\Windows
需要转义的还有:
( ) * + . [ ] ? |
C#中要想输出. 不需要转义
规则:C#中写正则表达式string Pattern = @"unibetter\$com";
引号里面得东东如果要输出上面的那些特殊得字符的话,就必须在该字符得前面加上\ 然后前面的@不能掉
3)重复
![正则表达式总结(一)正则表达式](/Files/20116/678fba96-b59b-45a2-a92f-4af6a940578a.jpg)
Eg:
ra*t
结果为rt rat raat raaat
ra+t
结果为rat raat raaat
ra?t
结果为rt rat
Windows\d+匹配
Windows后面跟
1个或更多数字
^\w+匹配一行的第一个单词
4)字符类
指定一个范围:
像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!),像[0-9]代表的含意与\d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w
分析:\(?0\d{2}[) -]?\d{8}
先是一个转义字符\
然后是( 后面是?表示( 可以出现0次或1次
再是一个0 然后后面是接两个数字 然后[) -]? 表示)或-可以出现一次或0次
最后就是接八个数字
可以出现得情形:(010)33344432
022-34566666
03292929399 (03292929399 032)92929399
(032-92929399
5)分支条件
0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。
\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔
6)分组
如果想要重复多个字符又可以用小括号来指定子表达式(也叫做分组)
(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配1到3位的数字,(\d{1,3}\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。
122.2.2.123
7)反义
![正则表达式总结(一)正则表达式](/Files/20116/d82c6a77-d851-47ac-b121-ca238e657013.jpg)
8)零宽断言
(?=exp)也叫零宽度正预测先行断言
\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading
零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp
例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字
(?
9.)
贪婪与懒惰
a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
a.*?b匹配最短的,以a开始,以b结束的字符串。如果把它应用于aabab的话,它会匹配aab(第一到第三个字符)和ab
*为什么第一个匹配是aab(第一到第三个字符)而不是ab(第二到第三个字符)?简单地说,因为正则表达式有另一条规则,比懒惰/贪婪规则的优先级更高:最先开始的匹配拥有最高的优先权
三、正则在C#中的运用
using System.Text.RegularExpressions;
class Program { static void Main(string[] args) { //Program.matchExpressions("Adsdsds323232"); //Program.matchAndReturn("2aaasss3"); Program.matchAndReturn("你好的速度撒东东"); //Program.replaceWord("bbbddsdsads,fdfdddddaaaa"); //Program.splitWord("192.168.1.1"); } //匹配是否存在 private static void matchExpressions(string strString) { if (Regex.IsMatch(strString, @"\ba", RegexOptions.IgnoreCase)) Console.WriteLine("YES"); else Console.WriteLine("NO"); } //匹配,并且返回匹配值 private static void matchAndReturn(string strString) { // MatchCollection maths = Regex.Matches(strString, @"\d+"); MatchCollection maths = Regex.Matches(strString, @".+?)>(?
.+?)", RegexOptions.IgnoreCase); //不区分大小写的匹配 并且匹配多行,编译(表示你的正则表达式是否要编译,就类比我们数据库中的存储结构和一般的查询语句的关系.如果你的正则表达式只用一次,那么你编译就没有什么意义,如果很常用,那么编译后,以后的匹配就快些.) //MatchCollection maths = new Regex(strString, @".+?)>(?.+?)", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Complied); if (maths != null) { foreach (Match mc in maths) { string content = mc.Groups["content"].Value; Console.WriteLine(content); //Console.WriteLine(mc.ToString()); } } else Console.WriteLine("字符串中不包含匹配的项"); } //替换 private static void replaceWord(string strString) { Regex regex = new Regex("a"); string result = regex.Replace(strString, "");//b替代a Console.WriteLine(result); } //分割 private static void splitWord(string strString) { Regex regex = new Regex(@"\."); string[] result = regex.Split(strString); foreach (var a in result) { Console.WriteLine(a); } } }
延伸阅读
- 2011-9-20-- 正则表达式支持库,ORACLE中的支持正则表达式的函数
- 2011-9-19-- 正则表达式语法,正则表达式 精细 语法
- 2010-12-9-- js正则表达式,[js]一个获取页面ip的正则
- 2010-12-9-- 正则表达式,JavaScript 正则表达式使用详细参数
- 2010-12-15-- 正则表达式,在PHP中使用与Perl兼容的正则表达式
- 2010-12-9-- 正则表达式,在MySQL中用正则表达式替换数据库中的内容的方法
- 2010-12-9-- 精通正则表达式,精通JS正则表达式(推荐)
- 2010-12-9-- js正则表达式,js 常用正则表达式表单验证代码
- 2010-12-9-- 正则表达式,正则表达式regular expression详述(一)
- 2010-12-9-- js正则表达式,JS 正则表达式的相关方法(正则学习笔记1)
最新评论