正则表达式
正则表达式(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。
列
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//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
exec,返回一个数组,数组的第一个元素为完整的匹配内容
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
注意,当字符串不匹配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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//例如我想把如下格式记录中的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}", 值,单位);
//手机号码
Regex reg = new Regex(@"^(13[0-9] | 14[5|7] | 15[0-9] | 18[0-9]) \d{8}$");