欢迎来到 Purvisの部落格.|

兰purvis

园龄:7年10个月粉丝:12关注:42

C#常用正则表达式回顾

项目中有些时候需要用到正则表达式,但是自己对正则表达式不熟悉,每次学习完,过一段时间(长时间)不用,就又忘了,每次需要用到的时候都需要百度下,比较麻烦,这里把C#中经常用到的正则表达式做下总结。

正则表达式常用的环境

爬虫、网站数据验证、日志分析、字符串替换、获取子字符串、文本处理、字符串处理等

正则基础

1. []方括号表示匹配可以匹配方括号中的任意点单个字符,方括号只允许匹配单个字符。
2. | 或表示两项之间的一个选择,它不能和方括号使用,只能和小括号使用。
3. ()小括号表示一个子表达式的开始和结束位置
4. ^ 否符号,如果用在方括号内,“^”表示不想要匹配的字符。
5. . 点字符:匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。
6. 定位符:定位符使您能够将正则表达式固定到行首或行尾,^ 和 $ 分别指字符串的开始与结束
7. 限定符:限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配

  • * 表示匹配前面的子表达式0次或多次
  • ?表示匹配前面的子表达式0次或一次
  • + 表示匹配前面的子表达式至少匹配一次
  • {n} 表示匹配前面的子表达式n次
  • {n,m} 表示匹配前面的子表达式从n次到m次

8. 转义字符

  • \d 匹配一个数字字符。等价于 [0-9]。
  • \D 匹配一个非数字字符。等价于 [^0-9]。
  • \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
  • \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
  • \w 匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。
  • \W 匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'。
  • \n 匹配一个换行符
  • \r 匹配一个回车符
  • \b 匹配一个单词边界,即字与空格间的位置。匹配单词的开始或者结尾部分
  • \B 匹配非单词边界 匹配单词的中间部分,例如:匹配:Chapter中的apt,/\Bapt/

9. 捕获组:除(Expression)和(?<name>Expression)语法外,其它的(?...)语法都不是捕获组。

    var str = "Is is the cost of of gasoline going up up";
    var patt1 = @"\b([a-z]+) \1\b";
    var matchDatas1 = Regex.Matches(str, patt1).Select(x => x.Value);
    Console.WriteLine(JsonConvert.SerializeObject(matchDatas1));//["of of","up up"]

捕获组的顺序是从左到右,从1开始,0代表整体,这里的\1就是分组的第一个自匹配项,在Replace中可以用$1操作

    string a = @"(020)76544567";
    string b = @"\((\d{3})\)(\d{8})";
    var c = new Regex(b);
    string d = c.Replace(a, "$0-$1-$2");
    Console.WriteLine(d);//(020)76544567-020-76544567    

10.选择
用圆括号将所有选择项括起来,相邻的选择项之间用|分割。用圆括号会有一个副作用,使相关的匹配会被缓存,缓存的数据会占用内存,降低匹配效率。此时可用?:放在第一个选项前来消除这种副作用。
可以使用非捕获元字符 ?:、?= 或 ?! 来重写捕获,忽略对相关匹配的保存。

  • (?:pattern)匹配pattern,但不捕获匹配结果。'industr(?:y|ies)' 例如:匹配'industry'或'industries'。
  • (?=pattern)零宽度正向预查,不捕获匹配结果。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”
  • (?!pattern)正向否定预查,不捕获匹配结果。例如,“Windows(?!95|98|NT|2000)”不能匹配“Windows2000”中的“Windows”,但能匹配“Windows3.1”中的“Windows”

常用正则表达式

1. 非空字符串,适用于匹配单词,关键字等 @"\S+"

2. html标签 @"<[^>]+>"

  • 匹配带连接的a标签 @"<a[^>]*?href=(['""]?)(?<url>[^'""\s>]+)\1[^>]*>(?<text>(?:(?!</?a\b).)*)</a>"
  • 匹配链接 "(href|src)\s*=\s*(?:\"(?<1>[^\"]*)\"|(?<1>\S+))"
  • 匹配图片 "<img(.*?)>"
  • 任意标签: @"\<[^\>]+\>([^\<]+)\<\/[^\>]+\>"

3. Email地址:@"\w+@(\w+\.)+\w{2,3}";

4. 域名:@"[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?";

5. InternetURL:@"[a-zA-z]+://[^\s]*" 或 @"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$";

6. 手机号码:@"^([1][3,4,5,6,7,8,9])\d{9}$";

7. 国内电话号码:@"\d{3}-\d{8}|\d{4}-\d{7}";

8. 身份证:@"(^\d{15})|(\d18)|(^\d{17}(\d|X|x)$)";

9. 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 6-10 之间):@"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{6,10}$";

10. 简单密码:@"\w{6,10}";

11. 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):@"^[a-zA-Z][a-zA-Z0-9_]{4,15}$";

12. 钱:@"^[0-9]+(.[0-9]+)?$";

13. QQ:@"[1-9][0-9]{4,}";

13. 邮政编码:@"[1-9]\d{5}(?!\d)";

14. IP:@"^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$";

15. 数字: @"^\d+$";

16. 字母:@"^[a-zA-Z]+$";

17. 获取Html中的文本内容

        public static string GetHtmlText(string html)
        {
            html = Regex.Replace(html, @"<[^<>]+>", "", RegexOptions.IgnoreCase);
            html = html.Replace("\r\n", "").Replace("\r", "").Replace("&nbsp;", "").Replace(" ", "");
            return html;
        }

 18.隐藏手机号中间几位数

Regex.Replace(手机号, "(\\d{3})\\d{4}(\\d{4})", "$1****$2");

本文作者:兰purvis

本文链接:https://www.cnblogs.com/purvis/p/15137500.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   兰purvis  阅读(54)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.

作曲 : Reol

作词 : Reol

fade away...do over again...

fade away...do over again...

歌い始めの一文字目 いつも迷ってる

歌い始めの一文字目 いつも迷ってる

どうせとりとめのないことだけど

伝わらなきゃもっと意味がない

どうしたってこんなに複雑なのに

どうしたってこんなに複雑なのに

噛み砕いてやらなきゃ伝わらない

ほら結局歌詞なんかどうだっていい

僕の音楽なんかこの世になくたっていいんだよ

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

僕は気にしない 君は気付かない

何処にももういないいない

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

忘れていく 忘れられていく

We don't know,We don't know.

目の前 広がる現実世界がまた歪んだ

目の前 広がる現実世界がまた歪んだ

何度リセットしても

僕は僕以外の誰かには生まれ変われない

「そんなの知ってるよ」

気になるあの子の噂話も

シニカル標的は次の速報

麻痺しちゃってるこっからエスケープ

麻痺しちゃってるこっからエスケープ

遠く遠くまで行けるよ

安定なんてない 不安定な世界

安定なんてない 不安定な世界

安定なんてない きっと明日には忘れるよ

fade away...do over again...

fade away...do over again...

そうだ世界はどこかがいつも嘘くさい

そうだ世界はどこかがいつも嘘くさい

綺麗事だけじゃ大事な人たちすら守れない

くだらない 僕らみんなどこか狂ってるみたい

本当のことなんか全部神様も知らない

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

僕は気にしない 君は気付かない

何処にももういないいない

Everybody don't know why.

Everybody don't know why.

Everybody don't know much.

忘れていく 忘れられていく

We don't know,We don't know.