步步为营-18-正则表达式
说明:一个工具Regulator需要用到
一:正则表达式
1 what & why
1.1 啥是正则?
匹配字符串的规则。
1.2 为什么要用正则?
可以通过正则用来判断、寻找相应的字符串。例如:表单验证,判断是不是手机号、爬虫,从网页中爬取相应信息。
2 基本语法
1 元字符
. 匹配任意单个字符
* 匹配前面内容出现0或多次
+ 匹配前面内容出现1或多次
? 匹配前面内容出现0或1次; 将贪婪模式转化为非贪婪模式
贪婪模式 李琪(liqi);史昱(shiyu);李志强(lizhiqiang);李晶(ljing) \((.+)\) (liqi);史昱(shiyu);李志强(lizhiqiang);李晶(ljing)
非贪婪模式 李琪(liqi);史昱(shiyu);李志强(lizhiqiang);李晶(ljing) \((.+?)\) (liqi)(shiyu)(lizhiqiang)(ljing)
| 或者z|food 匹配z或者food
() a:可以改变优先级;b:可以分组
[] 匹配[]中国的字符出现的一次.如[0-9]
{} 匹配前面内容出现的次数; a:指定次数如zo{2}o出现2次 ;a:指定次数如zo{2,4} o出现至少2次,最多4次;
^ a:以某些字符串开头.如: ^abc 以abc开头 b:取反
$ 以某些字符串结尾.
2 简写表达式
\d 代表一个数字,等于[0-9];
\D 代表一个非数字,等于[^0-9]
\s 代表换行符,tab键等空白字符
\S 代表非空白字符
\w 匹配字母 数字 下划线 汉字等
\W ^w
二:练习
0:匹配括号中的内容
李琪(liqi);史昱(shiyu);李志强(lizhiqiang);李晶(ljing) 匹配为 liqi;shiyu;lizhiqiang;ljing
<script type="text/javascript"> onload = function () { var str = "李琪(liqi);史昱(shiyu);李志强(lizhiqiang);李晶(ljing)"; var reg = /([^\(\)]+)(?=\))/g; //var result = str.match(reg);//此时result是数组 //var Result2 = result.join(";");//此时Result2 是 liqi;shiyu;lizhiqiang;ljing var result = str.match(reg).join(";"); alert(result); } </script>
[] 中的内容 /([^\(\)]+)(?=\))/g
0.1 去掉括号中的内容在C# 代码中
string st = "陈霓;蔡齐貌;蔡梅芳(caimf);蔡文婷(caiwt)";
Regex reg = new Regex(@"(\(.*?\))");
st.FastnessCCUser = reg.Replace(st, "");
输出结果 "陈霓;蔡齐貌;蔡梅芳;蔡文婷"
1:从文件中提取文件名如:C:\abc\123\test.txt
先在regulator中测试
然后放在程序中
string path = @"C:\abc\123\test.txt"; Match mc = Regex.Match(path, @".+\\([a-zA-Z0-9]+\.[a-zA-Z]+)"); if (mc.Success) { Console.WriteLine(mc.Groups[1].Value); } Console.Read();
2:匹配年月日
代码中
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace 正则表达式 { class Program { static void Main(string[] args) { string date = @"June 26, 2017"; Match mc = Regex.Match(date, @"([a-zA-Z]+)\s+([0-9]+),+\s+([0-9]+)"); if (mc.Success) { Console.WriteLine(mc.Groups[1].Value); Console.WriteLine(mc.Groups[2].Value); Console.WriteLine(mc.Groups[3].Value); } Console.Read(); } } }
3 匹配IP地址 192.168.100.5[port=21,type=ftp]或者192.16.10.10[port=21]
static void Main(string[] args) { //string date = @"192.168.100.5[port=21,type=ftp]"; string date = @"192.168.100.5[port=21]"; Match mc = Regex.Match(date, @"(?<ip>\d{3}(\.\d{1,3}){3})\[(?<port>port=[0-9]{1,5})(,(?<type>(type=\w+)))?"); if (mc.Success) { Console.WriteLine(mc.Groups["ip"].Value); Console.WriteLine(mc.Groups["port"].Value); Console.WriteLine(mc.Groups["type"].Value); } Console.Read(); }
4:匹配[]的内容
string businessCondition = publish.BusinessCondition; string pattern = @"([^\:\]]+)(?=\])"; Regex regex = new Regex(pattern, RegexOptions.IgnoreCase); MatchCollection matchs = regex.Matches(businessCondition); if (matchs!=null&&matchs.Count>0) { foreach (var item in matchs) { if (item!=null) { string wordKey = item.ToString().ToLower(); conditionWords.Add(wordKey); } } }