正则表达式

 

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。

1.匹配任意单个字符
“.”(点)可以匹配任意的 单个 字符、英文字母、数字,以及它本身。有的时候,我们不想让“.”去匹配任何的字符,仅仅想让它匹配“.”这一单个字符,也就是仅匹配它本身,此时,可以使用“\.”来对它进行转义

2.字符组的基本语法

“[dt]”。中括号是特殊标记,用以划定属于组内的字符的界限,它所代表的含义是:“匹配d或者t”。仅在d和t中选一个

2.1 在字符组中使用字符区间

列 “[0-3]”,它将仅匹配“0,1,2,3”这个区间。起始字符 和 结束字符,

3 ^ 和 [^指定字符串] 之间的区别:
^ 指的是匹配字符串开始的位置
[^指定字符串] 将^用【^】包裹时 指的是除指定字符串以外的其他字符串
(^[0-9])+     //匹配有一至多个数字的字符串组合
[^[0-9]]+  // 匹配有一至多个不含数字的字符串组合

4 匹配元字符

很容易就看出“\”也是一个元字符,它叫做转义符。所以,当我们需要匹配字符“\”的时候,就需要对它进行转义:“\\”。
回想一下之前讲述的字符组,我们知道“[”和“]”也是元字符,当我们需要匹配“[”和“]”字符的时候,需要分别写作:\[和\]。

4.1

对于“.”和“[”等来说,它们本身就是 元字符,而当给它们前面加上转义字符“\”的时候,它们才代表一个普通字符:“\.”匹配字符“.”,“\[”匹配字符“[”。
对于“r”和“n”等来说,它们本身只是 普通字符,而只有当加上转义字符“\”的时候(变成了“\r”和“\n”),它们才代表着元字符:“\r”匹配空字符回车,“\n”匹配空字符换行。

元字符 匹配描述
\d 所有单个数字,与 [0-9] 相同
\D 所有非数字,与 [^0-9] 相同
\w 所有单个大小写字母、数字、下划线,与 [a-zA-Z0-9_] 相同
\W 所有单个非大小写字母、非数字、非下划线,与 [^a-zA-Z0-9_] 相同
\s 所有单个空字符,与 [\f\n\r\t\v] 相同
\S 所有单个非空字符,与 [^\f\n\r\t\v] 相同
+ 表示匹配一个或多个(换言之,至少一个)字符组成的字符串。>=1
* 匹配零个或多个字符组成的字符串.>=0
? 匹配零个或一个字符 ?=0或?=1
\b  匹配其 后面 的字符位于字符串首位的字符
\B  匹配不在边界的字符

 

 

 

 

 

 

 

 

 

 

5 匹配固定数目的字符{}

例如:使用“\d{3}”,可以匹配从 000 到 999,这1000个数。而使用“a{6}”,则可以匹配“aaaaaa”(也只能匹配它,因为“a”是固定字符)。

“\d{3}”,尽管它没有错,但它只能匹配精确地匹配3位:000、001、002 … 100、101 … 999。而通常,我们需要对于 0、10、99 这样的数也能够匹配,这时,就需要指定可以匹配 1到3位的数字\d{1,3}。

正则表达式中,使用“{最小数目,最大数目}”的语法来实现。\d{1,3}

如果最小数目可以是0,所以 “{0,1}”,相当于 “?”。

如果不限制最大数目,可以将最大数目设为空,所以“\d{1,}”相当于“+”;而“{0,}”相当于“*”。

 

(一)在js中的应用

g (全文查找) 
i (忽略大小写) 
m (多行查找) 
 

test,返回一个 Boolean 值,它指出在被查找的字符串中是否存在模式。如果存在则返回 true,否则就返回 false。

 列

//test方法,测试字符串,符合模式时返回true,否则返回false  
var re = /he/;//最简单的正则表达式,将匹配he这个单词  
var str = "he";  
alert(re.test(str));//true  
str = "we";  
alert(re.test(str));//false  
str = "HE";  
alert(re.test(str));//false,大写,如果要大小写都匹配可以指定i标志(i是ignoreCase或case-insensitive的表示)  
re = /he/i;  
alert(re.test(str));//true 
 
str = "Certainly!He loves her!";  
alert(re.test(str));//true,只要包含he(HE)就符合,如果要只是he或HE,不能有其它字符,则可使用^和$  
re = /^he/i;//脱字符(^)代表字符开始位置  
alert(re.test(str));//false,因为he不在str最开始  
str = "He is a good boy!";  
alert(re.test(str));//true,He是字符开始位置,还需要使用$  
re = /^he$/i;//$表示字符结束位置  
alert(re.test(str));//false  
str = "He";  
alert(re.test(str));//true  
//当然,这样不能发现正则表达式有多强大,因为我们完全可以在上面的例子中使用==或indexOf  
re = /\s/;// \s匹配任何空白字符,包括空格、制表符、换页符等等  
str= "user Name";//用户名包含空格  
alert(re.test(str));//true  
str = "user     Name";//用户名包含制表符  
alert(re.test(str));//true  
re=/^[a-z]/i;//[]匹配指定范围内的任意字符,这里将匹配英文字母,不区分大小写  
str="variableName";//变量名必须以字母开头  
alert(re.test(str));//true  
str="123abc";  
alert(re.test(str));//false
View Code

exec,返回一个数组,数组的第一个元素为完整的匹配内容

var osVersion = "Ubuntu 8";//其中的8表示系统主版本号  
var re = /^[a-z]+\s+\d+$/i; //+号表示字符至少要出现1次,\s表示空白字符,\d表示一个数字  
alert(re.test(osVersion));//true,但我们想知道主版本号  
//另一个方法exec,返回一个数组,数组的第一个元素为完整的匹配内容  
re=/^[a-z]+\s+\d+$/i;  
arr = re.exec(osVersion);  
alert(arr[0]);//将osVersion完整输出,因为整个字符串刚好匹配re  
//我只需要取出数字  
re=/\d+/;  
var arr = re.exec(osVersion);  
alert(arr[0]);//8


//exec返回的数组第1到n元素中包含的是匹配中出现的任意一个子匹配  
re=/^[a-z]+\s+(\d+)$/i;//用()来创建子匹配  
arr =re.exec(osVersion);  
alert(arr[0]);//整个osVersion,也就是正则表达式的完整匹配  
alert(arr[1]);//8,第一个子匹配,事实也可以这样取出主版本号  
alert(arr.length);//2  
osVersion = "Ubuntu 8.10";//取出主版本号和次版本号  
re = /^[a-z]+\s+(\d+)\.(\d+)$/i;//.是正则表达式元字符之一,若要用它的字面意义须转义  
arr = re.exec(osVersion);  
alert(arr[0]);//完整的osVersion  
alert(arr[1]);//8  
alert(arr[2]);//10
View Code

注意,当字符串不匹配re时,exec方法将返回null

 replace方法,用于替换字符串  

search方法,用于查找索引,第一个匹配的就立即返回

match方法也用于将字符串与正则表达式进行匹配并返回结果数组 类似于exec方法

source

var re = /[a-z]/i; 
alert(re.source);//将[a-z]字符串输出 
//请注意,直接alert(re)会将正则表达式连同前向斜线与标志输出  /[a-z]/i,这是re.toString方法定义的

字符类 ---〉简单类,反向类,范围类,组合类,预定义类 

//简单类  
var re = /[abc123]/;//将匹配abc123这6个字符中一个  
//负向类  
re = /[^abc]/;//将匹配除abc之外的一个字符  
//范围类  
re = /[a-b]/;//将匹配小写a-b 26个字母  
re = /[^0-9]/;//将匹配除0-9 10个字符之处的一个字符  
//组合类  
re = /[a-b0-9A-Z_]/;//将匹配字母,数字和下划线

C#中的式列

  public  bool IsMobilePhone(string input)
        {
            Regex regex = new Regex("^(13|15|18)\\d{9}$");
            return regex.IsMatch(input); //构造函数中指定的正则表达式在输入字符串中是否找到匹配项
        }

 bool isPhone = IsMobilePhone("13998658745");//调用IsMobilePhone方法传入手机号

 Console.WriteLine(isPhone);输出true  或 fales

//例如我想把如下格式记录中的NAME值修改为WANG
string line = "ADDR=1234;NAME=ZHANG;PHONE=6789";
Regex reg = new Regex("NAME=(.+);");
string modified = reg.Replace(line, "NAME=WANG;");
//修改后的字符串为 ADDR=1234;NAME=WANG;PHONE=6789

//例如我想提取line中的NAME值
Match match = reg.Match(line);
string value = match.Groups[1].Value;
Console.WriteLine("value的值为:{0}", value);//ZHANG

//文本中含有"speed=30.3mph",需要提取该速度值,但是速度的单位可能是公制也可能是英制,mph,km/h,m/s都有可能;另外前后可能有空格。
string line = "lane=1;speed=30.3mph;acceleration=2.5mph/s";
Regex reg = new Regex(@"speed\s*=\s*([\d\.]+)\s*(mph|km/h|m/s)*");
Match match = reg.Match(line);
//那么在返回的结果中match.Groups[1].Value将含有数值,而match.Groups[2].Value将含有单位。
var 值 = match.Groups[1].Value;//此处方便演示,在实际开发中请勿使用中文命名变量
var 单位 = match.Groups[2].Value;
Console.WriteLine("speed的值为:{0} speed的单位是:{1}", 值,单位);
View Code

//手机号码
    Regex reg = new Regex(@"^(13[0-9] | 14[5|7] | 15[0-9] | 18[0-9]) \d{8}$");

 

posted @ 2018-04-13 15:33  诸子百家,唯我纵横  阅读(161)  评论(0编辑  收藏  举报