最近项目需要用到正则表达式,处理字符串。正则表达式我也是第一次接触,这个随笔记录一下学习的心得;
首先我需要从一串url中将协议、域名、以及端口号提取出来;
我用了这么一串正则表达式:
^((https|http|ftp|rtsp|mms):////)?([^:/]+)([:]([0-9]+))?$
开头第一个^匹配输入字符串开始的位置;
结尾$匹配输入字符串结尾的位置;
表达式中每一个括号都表示一个子表达式,并可以捕获;
如下面一串url:http://192.168.0.1:801;
(https|http|ftp|rtsp|mms) 匹配http,((https|http|ftp|rtsp|mms):////)匹配http://
((https|http|ftp|rtsp|mms):////)? 中 ?号表示前面这串正则匹配的字数可以为0次或者1次;
([^:/]+)匹配的是 192.168.0.1,[^:/]表示匹配不是:或者/的字符,+表示前面这串字符匹配次数可以为多次;
([:]([0-9]+))?匹配的是:801 里括号([0-9]+)表示多次匹配0-9的字符,[:]表示匹配:。捕获端口,若没有端口不捕获;
这是我要求的正则表达式的主体,现在用C#实现我的要求;
引入空间命名 System.Text.RegularExpressions;
Regex r = new Regex(@"^((?<proto>https|http|ftp|rtsp|mms):////)?(?<domain>[^:/]+)([:](?<port>[0-9]+))?$", RegexOptions.Compiled);
//(?<名称>正则表达式),这是分组构造的写法。意思是将正则表达式匹配的内容捕获放入命名组<名称>中;
var match= r.Match("http"//192.168.0.1:801");
string proto=match.Result("${proto}");
string domain=match.Result("${domain}");
string port=match.Result("${port}");
//使用上述方法就可以把命名组中的字符串取出来;
我用我自己的实例简单的介绍了一下正则表达式的用法。楼主也是初接触正则表达式,还比较生疏,望见谅;
https://msdn.microsoft.com/zh-cn/library/az24scfc.aspx
微软这个站点学习起来还是比较方便的;