没有烟抽的日子

天黑了路无法延续到黎明 我的思念一条条铺在那个灰色小镇的街头

博客园 首页 新随笔 联系 订阅 管理

regex类(个人理解)

 

C#regex是正则表达式类
用于string的处理,查找匹配的字符串。
1,先看一个例子
Regex regex=new Regex(@”OK“);//我们要在目标字符串中找到"OK"
Match m=regex.Match("fjsladfOK");
console.writeline(m.tostring());//这是查找OK
//结果是:OK
2,
Regex regex=new Regex(@"\d+");//      \d+是代表数字
Match m=regex.Math("jflsadkj  98");
console.writeline(m.tostring);//结果为98
3,关键为如何写特殊字符
”\w+"代表字母  "\W+"代表字符   "\s+" 代表空格   "$"代表字符串结束了
4,

关于零宽度断言有多种叫法,也有叫环视、也有叫预搜索的,我这里采用的是 MSDN 中的叫法,关于零宽度断言有以下几种:

(?= 子表达式 ): 零宽度正预测先行断言。仅当子表达式在此位置的右侧匹配时才继续匹配。例如, 19(?=99) 与跟在 99 前面的 19 实例匹配。

(?! 子表达式 ): 零宽度负预测先行断言。仅当子表达式不在此位置的右侧匹配时才继续匹配。例如, (?!99) 与不以99 结尾的单词匹配,所以不与 1999 匹配。

(?<= 子表达式 ): 零宽度正回顾后发断言。仅当子表达式在此位置的左侧匹配时才继续匹配。例如, (?<=19)99与跟在 19 后面的 99 的实例匹配。此构造不会回溯。

(?<! 子表达式 ): 零宽度负回顾后发断言。仅当子表达式不在此位置的左侧匹配时才继续匹配。例如 (?<!19) 与不以 19 开头的单词匹配,所以不与 1999 匹配。

eg:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace 正则表达式
{
class Program
{
static void Main(string[] args)
{
string p = @"(^\[)([a-z]{1})(\d+)([a-z])(\s+)(?=\])";
string text = "[s434b ]jf";
Regex regex = new Regex(p, RegexOptions.IgnoreCase);
MatchCollection mc = regex.Matches(text);
foreach (Match ma in mc)
{
for (int k = 0; k < ma.Groups.Count; k++)
{
Console.WriteLine("match  groud{0} :{1}", k, ma.Groups[k].Value);
}
}
Console.Read();

}
}
}
搜索出来的结果并没有“】” ,所以这个就说明“零宽度断言”仅仅是个条件

5,

正则表达式元字符

正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达式具有处理 能力。元字符既可以是放在 [] 中的任意单个字符(如 [a] 表示匹配单个小写字符 a ),也可以是字符序列(如 [a-d] 表示匹配 a 、 b 、 c 、 d 之间的任意一个字符,而 \w 表示任意英文字母和数字及下划线),下面是一些常见的元字符:

元字符

说明

.

匹配除 \n 以外的任何字符(注意元字符是小数点)。

[abcde]

匹配 abcde 之中的任意一个字符

[a-h]

匹配 a 到 h 之间的任意一个字符

[^fgh]

不与 fgh 之中的任意一个字符匹配

\w

匹配大小写英文字符及数字 0 到 9 之间的任意一个及下划线,相当于 [a-zA-Z0-9_]

\W

不匹配大小写英文字符及数字 0 到 9 之间的任意一个,相当于 [^a-zA-Z0-9_]

\s

匹配任何空白字符,相当于 [ \f\n\r\t\v]

\S

匹配任何非空白字符,相当于 [^\s]

\d

匹配任何 0 到 9 之间的单个数字,相当于 [0-9]

\D

不匹配任何 0 到 9 之间的单个数字,相当于 [^0-9]

[\u4e00-\u9fa5]

匹配任意单个汉字(这里用的是 Unicode 编码表示汉字的 )

正则表达式限定符

上面的元字符都是针对单个字符匹配的,要想同时匹配多个字符的话,还需要借助限定符。下面是一些常见 的限定符 ( 下表中 n 和 m 都是表示整数,并且 0<n<m) :

限定浮

说明

*

匹配 0 到多个元字符,相当于 {0,}

?

匹配 0 到 1 个元字符,相当于 {0,1}

{n}

匹配 n 个元字符

{n,}

匹配至少 n 个元字符

{n,m}

匹配 n 到 m 个元字符

+

匹配至少 1 个元字符,相当于 {1,}

\b

匹配单词边界

^

字符串必须以指定的字符开始

$

字符串必须以指定的字符结束

说明:

( 1 )由于在正则表达式中“ \ ”、“ ? ”、“ * ”、“ ^ ”、“ $ ”、“ + ”、“(”、“)”、“ | ”、“ { ”、“ [ ”等字符已经具有一定特殊意义,如果需要用它们的原始意义,则应该对它进行转义,例如希 望在字符串中至少有一个“ \ ”,那么正则表达式应该这么写: \\+ 。

( 2 )可以将多个元字符或者原义文本字符用括号括起来形成一个分组,比如 ^(13)[4-9]\d{8}$ 表示任意以 13开头的移动手机号码。

( 3 )另外对于中文字符的匹配是采用其对应的 Unicode 编码来匹配的,对于单个 Unicode 字符,如 \u4e00 表示汉字“一”, \u9fa5 表示汉字“龥”,在 Unicode 编码中这分别是所能表示的汉字的第一个和最后一个的 Unicode 编码,在 Unicode 编码中能表示 20901 个汉字。

( 4 )关于 \b 的用法,它代表单词的开始或者结尾,以字符串“ 123a 345b 456 789d ”作为示例字符串,如果正则表达式是“ \b\d{3}\b ”,则仅能匹配 456 。

( 5 )可以使用“ | ”来表示或的关系,例如 [z|j|q] 表示匹配 z 、 j 、 q 之中的任意一个字母。

(以上内容参考http://blog.csdn.net/zhoufoxcn/archive/2010/03/12/5372420.aspx)

posted on 2016-01-20 16:59  没有烟抽的日子  阅读(580)  评论(0编辑  收藏  举报