正则表达式-笔记

任意字符: [\s\S]*

匹配空格 ,有3种:

​​半角空格' ',匹配代码:【\x{0020}】或者【\x20】
全角空格' ',匹配代码:【\x{3000}】
同时匹配全半角:[\x{0020}|\x{3000}]
空格占位符' ',匹配代码:【\x{00a0}】
​

匹配转义字符

如果需要用它们的原始意义,则应该对它进行转义,

​'\'、'?'、'*'、'^'、'$'、'+'、'('、')'、'|'、'{'、'['
'\\'   匹配字符'\'
\"     双引号,匹配字符"
\'     单引号,匹配字符'
'\.'   匹配字符'.',在正则中表示.的时候都是\.
'\?'   匹配字符'?'
'\*'   匹配字符'*'
'\^'   匹配字符'^'
'\$'   匹配字符'$'
'\+'   匹配字符'+'
'\('   匹配字符'('
'\)'   匹配字符')'
'\|'   匹配字符'|'
'\{'   匹配字符'{'
'\}'   匹配字符'}'
'\['   匹配字符'['
'\]'   匹配字符']'

不可见字符 非打印字符
\r      匹配字符回车
\n      匹配字符新行
\a	    警报(ANSI C)
\b	    退格
\f	    换页
\t	    水平制表符,tab键
\v	    垂直制表符

匹配编码

\nnn   匹配一个8进制ASCII
\xnn   匹配一个16进制ASCII
\unnnn \u{xxxx}、\x{xxxx} 匹配4个16进制的Uniode

​匹配ASCII码表范围内字符:[\x00-\x7f]
匹配非ASCII码表范围内字符:[^\x00-\x7f]
匹配中文字符:[\u4e00-\u9fa5]
匹配非中文字符:[^\u4e00-\u9fa5]

匹配空行 空白行 换行符

单行空行(包括空白字符行):^\s*\n
多行空行(包括空白字符行):\s*\n
匹配只有两个字的行: ^..$

string pattern = @"^\s*\n";   //空行,包括空白字符行
string pattern = @"\s*\n";    //换行符
匹配只有两个字的行: ^..$

范围匹配

x 开头 z 结尾的 提取中间范围  

例如:
string input ="x123456z"; //x开头z结尾字符串,想要匹配中间的'123456'
string pattern = @"(?<=x)(?:(?!z).)*";
string s2 = Regex.Matches(input, pattern, options)[0].Value;
Console.WriteLine(s2);
//output
s2 == '123456'

分析:
开头 :(?<=x) 如果x开头
(?!z). 不含Z的字符串
中间:(?:(?!z).)*  用非捕获分组 把 不含Z的字符串 看作一个整体 的匹配项
结尾:


方法2:
string input = "x123456z"; //x开头z结尾字符串,想要匹配中间的'123456'
string pattern = @"x([^z]+)";
string s2 = Regex.Matches(input, pattern)[0].Groups[1].Value;
Console.WriteLine(s2);
//output
s2 == '123456'

分析
思路讲解:
1.匹配开头:x
2.匹配中间的内容:要排除右边的z字符,:[^z]+


方法3:
匹配开头:正文<\/dt>
匹配中间:([\s\S]*)
匹配结尾:(?=<\/dl)
正文<\/dt>([\s\S]*)(?=<\/dl)

分组与替换

匹配表达式字符串中:

()括号包起来的表达式表示一个分组,第二个括号包起来的就是第二个分组,以此类推。分组从0开始,默认第0个分组,表示整个字符串.但是要排除两种括号情况:1.零宽断言的括号和2.gmis标志的括号不算分组.

替换表达式字符串中:

$1 和 \1 表示的意思相同(引用匹配到的第一个分组),\5或者$5就表示引用第5个分组。

\0表示整个字符串 Match.Groups[0].Value

匹配英文单词

​
\b\S*\b
解释:
\b表示 1.字母与空格空白符的边界 2.字母与行首行尾的边界 3.字母与半角标点符号的边界
\S表示非空白字符

匹配了以 'm' 开头以 'e' 结尾的单词
​\bm\S*e\b
如匹配:
make
maze
manage
measure

 零宽断言 如果  那么  边界定位

表达式意义案例
(?=X)如果是XAB(?=C)如果AB字母后面是C的话
(?!X)如果不是X(?!56)89如果89前面不是56的话
(?<=X)如果是X开头
(?!<X)如果不是X结尾
(?:(X).)*如果是不含Z的字符串(?:(?!</dl).)*
(?is)gmis标志:允许 . 匹配换行符和不区分大小写搜索

1,=号的,是肯定匹配

2,< 号的 ,是写在前面的,取后面的值

3,!号的 ,是否定的,

4,不带<号的,是写在后面的,取前面的值,

如果行的尾部 是以字母结尾,下一行还有字母和标点符号,那么就把行首尾连接起来.作用英文文章的句子以标点符号作为每行结尾

匹配表达式:(([a-zA-Z—])\r\n)(?=^.+[,\.\?!"]+.*\r\n)
替换表达式:$2

gmis标志

g 全局搜索。

i 不区分大小写搜索。

m 多行搜索。

s 允许 . 匹配换行符。

u 使用unicode码的模式进行匹配。

y 执行“粘性(sticky)”搜索,匹配从目标字符串的当前位置开始。

用法: (?xx)(?跟2两个标志) 例子:(?is) 例子2:(?gi) (?yu) 

url site 正则网站

:

在线计算正则网站 已失效http://xn--3br16j6xunsoc1ar2lk3am43e/   在线计算正则网站嗨正则-正则表达式在线测试与调试工具-支持JS,PHP,Python,Golang,PCRE-支持Mac/Win/Android三端安装使用https://hiregex.com/r/03Ams2/1C#在线代码执行编译器http://www.dooccn.com/csharp/正则解析Regular expression visualizer using railroad diagramshttps://regexper.com/

正则大全https://github.com/XianZhengquan/any-rule

正则相关的英文

名称英文名称中文
Assert断言
match匹配
Group分组
Capturing group捕获分组
matches匹配的组
Lookahead先行
Lookbehind回顾,后行
Regex表达式
Positive正向
Negative负向
gmis正则表达式标志 
Positive Lookahead正向先行
Negative Lookahead负向先行
Positive Lookbehind正向回顾
Negative Lookahead负向回顾
Non-capturing group非捕获分组

匹配xx开头xx结尾

regex = r"\"([^\"]+)\""#双引号之内的内容
​匹配中括号开头中括号结尾的之间内容
(\[[^\]]+\])
思路讲解:
1.匹配左边中括号:\[
2.匹配中括号内的内容,要排除右边的中括号符号,因为中括号是结尾符号:[^\]]+
3.匹配右边的中括号:\]

匹配中括号里的内容
 (.*)\[([^\[\]]*)\](.*)
如匹配  :
abc[123]abc

匹配' /'开头 'y'结尾的之间内容
(/[^y]+y)
如匹配  :
/// <summary


C# 代码
    /*
         string str = "a[中国人]b";
         var start = "[";
         var end = "]";
         return "中国人"
     */
    /// <summary>
    /// 从str中提取start开始到end结尾的内容
    /// <param name="str">a[中国人]b</param>
    /// <param name="start">[</param>
    /// <param name="end">]</param>
    /// <returns>中国人</returns>
    /// </summary>
    public static string PickUpCenter(this string str, string start, string end)
    {
        start = start.ToNomalStr();
        end = end.ToNomalStr();
        var pattern = "(?<=" + start + ")([.\\S\\s]*)(?=" + end + ")";
       //Console.WriteLine(pattern);
        Match result = Regex.Match(str,pattern);
        if (result.Success)
        {
            return result.Value;//此为匹配出的值
        }
        else
            return string.Empty;
    }
    /// <summary>
    /// 从str中提取start开始到end结尾的内容
    /// <param name="str">a[中国人]b</param>
    /// <param name="start">[</param>
    /// <param name="end">]</param>
    /// <returns>中国人</returns>
    /// </summary>
    public static List<string> PickUpCenters(this string str, string start, string end)
    {
        start = start.ToNomalStr();
        end = end.ToNomalStr();
        var pattern = "("+start + ")(" + "[^" + end + "]+" + ")(" + end+")";
       // var pattern = "(?<=" + start + ")([.\\S\\s]*)(?=" + end + ")";
        Console.WriteLine(pattern);
        var result = Regex.Matches(str, pattern);
        List<string> res =new List<string>();
        if (result.Count > 0)
        {
            foreach (Match  VARIABLE in result)
            {
                if (VARIABLE.Groups.Count == 4)
                {
                    Console.WriteLine(VARIABLE.Groups[2].Value);
                    res.Add(VARIABLE.Groups[2].Value);
                }
            }
            return res;
        }
        else
            return null;
    }
    /// <summary>
    /// 如果str含有 正则表达式特殊字符 ,则替换为普通字符 "["  => "\\["
    /// </summary>
    public static string ToNomalStr(this string str)
    {
        var dict = new Dictionary<string, string>()
        {
          //在C#语言中: "\\[" == @"\[" ,为了表示\所以多加一个斜杠
          { @"\",@"\\" },
          { "[",@"\[" },
          { "]",@"\]" },
          { "(",@"\(" },
          { ")",@"\)" },
          { "{",@"\{" },
          { "}",@"\}" },
          { "^",@"\^" },
          { "$",@"\$" },
          { "|",@"\|" },
          { "-",@"\-" },
          { "+",@"\+" },
          { "*",@"\*" },
          { "?",@"\?" },
          { "/",@"\/" },
          { "<",@"\<" },
          { ">",@"\>" },
        };
        foreach (var item in dict)
            str = str.Replace(item.Key, item.Value);
        return str;
    }

匹配后替换


匹配表达式时:()括号包起来的表达式表示一个分组,第二个括号包起来的就是第二个分组,以此类推。分组从0开始,默认第0个分组,表示整个字符串.

替换表达式时:$1 和 \1 表示的意思相同(引用匹配到的第一个分组),\5或者$5就表示引用第5个分组。

\0表示整个字符串 Match.Groups[0].Value

在C#中 整个字符串 代表第一个分组 ,第二括号表示第二个分组 ,

复制:

​查找表达式:"(.+)"
替换表达式:是($1),就是($1),还是($1),这个就是复制($1)

字符串:当我看见"他"了
替换后的字符串:当我看见是他,就是他,还是他,这个就是复制他了

替换 

.

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值