C#正则表达式Regex用法详解

目录
  • 一、正则表达式应用举例
    • 1、C#校验合法性:
    • 2、C#限制输入
    • 3、正则表达式匹配闭合HTML标签(支持嵌套)
      • 1、分组构造
      • 2、举例:
  • 二、.Net正则表达式测试器
    • 1、功能简介
    • 2、下载与安装
    • 3、界面截图
  • 三、.NET正则表达式Regex
    • 1、IsMatch(Input,patter[,options]) 否则匹配
      • 1、正则表达式选项:RegexOptions
      • 2、内联标志
    • 2、Match(Input,patter[,options]) 单个匹配
    • 3、Matches(Input,patter[,options]) 多个匹配
    • 4、Replace(Input,patter,replacement或evaluator [,options]) 替换
    • 5、Split(Input,patter[,options]) 拆分
      • 1、每4个长度进行分割
      • 2、提取单词
      • 3、每两个单词进行分割
    • 6、实例化Regex类

一、正则表达式应用举例

1、C#校验合法性:

if (!Regex.IsMatch(this.txtCode.Text.Trim(), @"^[0-9]*$", RegexOptions.Singleline))
    Console.Write("只能输入数字");

2、C#限制输入

输入除了数字之外的所有非法字符的判断

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    //退格键(8)、 回车(13)、全选(1)、复制(3)、粘贴(22)
    e.Handled = !(Regex.IsMatch(e.KeyChar, @"\d", RegexOptions.Singleline) || e.KeyChar == (char)8 || e.KeyChar != (char)13);
}

粘贴时过滤不是数字的字符

private void textbox1_TextChanged(object sender, EventArgs e)
 {
  var reg = new Regex("^[0-9]*$");
  var str = textbox1.Text.Trim();
  var sb = new StringBuilder();
  if (!reg.IsMatch(str))
  {
    for (int i = 0; i < str.Length; i++)
    {
      if (reg.IsMatch(str[i].ToString()))
      {
        sb.Append(str[i].ToString());
      }
    }
    textbox1.Text = sb.ToString();
    //定义输入焦点在最后一个字符
     textbox1.SelectionStart = textbox1.Text.Length;
  }
 }

3、正则表达式匹配闭合HTML标签(支持嵌套)

1、分组构造

分组构造描述了正则表达式的子表达式,通常用于捕获输入字符串的子字符串。 分组构造包括下表中列出的语言元素。 有关详细信息,请参阅 分组构造

分组构造 描述 模式 匹配
( subexpression ) 捕获匹配的子表达式并将其分配到一个从 1 开始的序号中。 (\w)\1 "deep" 中的 "ee"
(?< name >subexpression ​​​​​​​) 将匹配的子表达式捕获到一个命名组中。 (?<double>\w)\k<double> "deep" 中的 "ee"
(?< name1 -name2 >subexpression ) 定义平衡组定义。 有关详细信息,请参阅 分组构造中的"平衡组定义"部分。 (((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$ "3+2^((1-3)*(3-1))" 中的 "((1-3)*(3-1))"
(?:subexpression ) 定义非捕获组。 Write(?:Line)? "Console.WriteLine()" 中的 "WriteLine" "Console.Write(value)" 中的 "Write"
(?imnsx-imnsx:subexpression ) 应用或禁用 子表达式中指定的选项。 有关详细信息,请参阅 正则表达式选项 A\d{2}(?i:\w+)\b "A12xl A12XL a12xl" 中的 "A12xl" 和 "A12XL"
(?=subexpression ) 零宽度正预测先行断言。 \w+(?=\.) "He is. The dog ran. The sun is out."中的 "is"、"ran" 和 "out"
(?!subexpression ) 零宽度负预测先行断言。 \b(?!un)\w+\b "unsure sure unity used" 中的 "sure"和 "used"
(?<=subexpression ) 零宽度正回顾后发断言。 (?<=19)\d{2}\b "1851 1999 1950 1905 2003" 中的 "99"、"50" 和 "05"
(?<!subexpression ) 零宽度负回顾后发断言。 (?<!19)\d{2}\b "1851 1999 1950 1905 2003" 中的 "51"和 "03"
(?>subexpression ) 原子组。 [13579](?>A+B+) "1ABB 3ABBC 5AB 5AC" 中的 "1ABB"、"3ABB" 和 "5AB"

2、举例:

1、匹配带有Class的div标签:

<(?i)div[^>]*(?i)class=["']?.+["']?[\s\S]*>[^<>]*(((?'Open'<(?i)div[^>]*>)[^<>]*)+((?'-Open'</(?i)div>)[^<>]*)+)*(?(Open)(?!))</(?i)div>

文本:

<div class="codeHeader" id="code-try-5" data-bi-name="code-header"><span class="language">CSHTML</span><button
        type="button" class="action is-relative" data-bi-name="copy" aria-label="复制代码"></button>
    <span class="icon">
        <span class="docon docon-edit-copy" role="presentation"></span>
    </span>
    <span>复制</span>
    <div class="successful-copy-alert is-absolute has-right-zero has-top-zero has-left-zero has-bottom-zero is-flex has-flex-align-items-center has-flex-justify-content-center has-text-success-invert has-background-success is-transparent"
        aria-hidden="true">
        <span class="icon is-size-4">
            <span class="docon docon-check-mark" role="presentation"></span>
        </span>
    </div>
</div>

2、匹配class以successful开头的的div

<(?i)div[^>]*(?i)class=["']?successful.+["']?[\s\S]*>[^<>]*(((?'Open'<(?i)div[^>]*>)[^<>]*)+((?'-Open'</(?i)div>)[^<>]*)+)*(?(Open)(?!))</(?i)div>

3、匹配所有span标签

<(?i)span[^>]*>[^<>]*(((?'Open'<(?i)span[^>]*>)[^<>]*)+((?'-Open'</(?i)span>)[^<>]*)+)*(?(Open)(?!))</(?i)span>

二、.Net正则表达式测试器

网页版本工具:http://tools.jb51.net/regex

下载版:https://www.jb51.net/softs/61022.html

1、功能简介

  • 自动加载上次关闭前运行的最后一组数据
  • 支持树形,表格, 文本等三种结果查看方式
  • 支持快捷键操作(F5运行, F4切换查询替换模式, F6切换结果显示方式, F2复制代码, Ctrl+Tab切换焦点)
  • 选中树结点或单元格时自动选中源文本中对应的部分
  • 表格内容可自由选择, 自由复制
  • 表格内容可导出为csv/xlsx文件
  • 支持拖入文件作为匹配源文本
  • 支持忽略大小写,单行模式,多行模式,忽略空白,显式匹配, ECMAScript等各种选项
  • 可解析类似new Regex("abc", RegexOptions.Singleline | RegexOptions.Multiline)格式的C#代码
  • 支持生成并拷贝C#代码到系统剪切板

2、下载与安装

你可以使用以下两种方式中的任意一个来下载安装正则表达式测试器.

安装版: 下载 Regester安装程序,解压后运行 RegesterSetup.zh.exe

绿色版: 下载 Regester,解压后运行 Regester.exe,如果无法启动,请自行下载安装 Microsoft .Net Framework 4.5 后再试

3、界面截图

三、.NET正则表达式Regex

在C#中,要使用正则表达式类,请在源文件开头处添加以下语句:

using System.Text.RegularExpressions;

可参考微软文档 :.NET 正则表达式

1、IsMatch(Input,patter[,options]) 否则匹配

如果表达式在字符串中匹配,返回布尔值。

if (Regex.IsMatch("a.b.c.d", @"(\w)\.(\w)", RegexOptions.IgnoreCase))
    Console.Write("匹配成功");

1、正则表达式选项:RegexOptions

有如下选项


RegexOptions枚举值


内联标志


简单说明


ExplicitCapture


n


只有定义了命名或编号的组才捕获


IgnoreCase


i


不区分大小写


IgnorePatternWhitespace


x


消除模式中的非转义空白并启用由 # 标记的注释。


MultiLine


m


多行模式,其原理是修改了^和$的含义


SingleLine


s


单行模式,和MultiLine相对应

2、内联标志

相对于用RegexOptions在new Regex时定义Regex表达式的全局选项来说,内联标志可以更小粒度(以组为单位)的定义匹配选项,从而更方便表达我们的思想。

\bA(?i)b\w+\b 匹配“ABA Able Act”中的“ABA”和“Able”

2、Match(Input,patter[,options]) 单个匹配

如果在输入字符串中发现匹配,则返回匹配对象。(返回单个匹配对象)

Match m = Regex.Match("a.b.c.d", @"(\w)\.(\w)");
if (m.Success)
    Console.Write("Match=" + m.Value + " pos:" + m.Index);
//Match=a.b pos:0

3、Matches(Input,patter[,options]) 多个匹配

如果在输入字符串中发现全部匹配,则返回匹配集合对象。(返回多个匹配对象)

注意:匹配是不能重叠的,如果有重叠,在默认情况下,就选择最长的匹配(除非元字符后加问号)。

Regex的Match()或Matches()=>Match匹配(MatchCollection)=>Group 组(GroupCollection子模式)=>Capture捕获(CaptureCollection)

MatchCollection mc = Regex.Matches("a.b.c.d", @"(\w)\.(\w)");
for (int i = 0; i < mc.Count; i++)
{
    Match match = mc[i];
    Console.WriteLine("Match=" + match.Value + " :" + i);

    for (int j = 0; j < match.Groups.Count; j++)
    {
        Group group = match.Groups[j];
        Console.WriteLine("--Group =" + group.Value + " :" + j);
        for (int k = 0; k < group.Captures.Count; k++)
        {
            Console.WriteLine("------Captures =" + group.Captures[k].Value + " :" + k);
        }
    }
}

结果如下:

Match=a.b :0 
----Group =a.b :0 
--------Captures =a.b :0 
----Group =a :1 
--------Captures =a :0 
----Group =b :2 
--------Captures =b :0 
Match=c.d :1 
----Group =c.d :0 
--------Captures =c.d :0 
----Group =c :1 
--------Captures =c :0 
----Group =d :2 
--------Captures =d :0

返回匹配成功后的第一个子模式的值:

var mc = Regex.Matches(Server.UrlDecode(client.ResponseHeaders["Content-Disposition"]), @"filename=(.+)");
string filename = mc[0].Groups[1].Value;

4、Replace(Input,patter,replacement或evaluator [,options]) 替换

用给定的Replacement替换input中的匹配。

Console.WriteLine(Regex.Replace("this test*", "[^a-zA-Z]", "()")); //this()test()
Console.WriteLine(Regex.Replace("sevenyear", @"\w+", m =>
{
    return m.Value.ToUpper();
})
); //SEVENYEAR

5、Split(Input,patter[,options]) 拆分

在由模式定义的位置拆分input,返回string[]

string[] s = Regex.Split("first-second-thrid", "-");
for (int i = 0; i < s.Length; i++)
{
    Console.WriteLine(s[i]);
}
//first
//second
//thrid

1、每4个长度进行分割

var temp = Regex.Split("1234abcdef", @"(?<=\G.{4})(?!$)");
temp.ToList().ForEach(t => Console.WriteLine(t));
//1234
//abcd
//ef

2、提取单词

var temp = Regex.Split("1234 abcd efa", @"(?<=\S+\b\s+)");
temp.ToList().ForEach(t => Console.WriteLine(t));
//1234
//abcd
//ef

3、每两个单词进行分割

var temp = Regex.Split("1234,abcd,12345,abcd,ab", @"(?<=\G(?:\w+[,,]){2})");
temp.ToList().ForEach(t => Console.WriteLine(t));
//1234,abcd,
//12345,abcd,
//ab

6、实例化Regex类

Regex exp= new Regex(@"\w\.\w", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
MatchCollection mc = exp.Matches("a.b.c.d");

实例:

void Main()
{
    string ss = "259年又62天";
    MatchCollection mc = Regex.Matches(ss, @"(?:(?<year>\d+)年)?又?(?:(?<month>\d+)天)?");
    for (int i = 0; i < mc.Count; i++)
    {
        Match match = mc[i];
        Console.WriteLine("Match[" + i + "],Value:" + match.Value);

        for (int j = 0; j < match.Groups.Count; j++)
        {
            Group group = match.Groups[j];
            Console.WriteLine("--Group[" + j + "],Name:" + group.Name + "  ,Value:" + group.Value);
            for (int k = 0; k < group.Captures.Count; k++)
            {
                Console.WriteLine("------Captures[" + k + "],Value:" + group.Captures[k].Value);
            }
        }
        Console.WriteLine();
    }
}

Match[0],Value:259年又62天
--Group[0],Name:0  ,Value:259年又62天
------Captures[0],Value:259年又62天
--Group[1],Name:year  ,Value:259
------Captures[0],Value:259
--Group[2],Name:month  ,Value:62
------Captures[0],Value:62

Match[1],Value:
--Group[0],Name:0  ,Value:
------Captures[0],Value:
--Group[1],Name:year  ,Value:
--Group[2],Name:month  ,Value:

到此这篇关于C#正则表达式Regex用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#正则表达式Regex类的用法

    一.C#正则表达式符号模式 字 符 描 述 \ 转义字符,将一个具有特殊功能的字符转义为一个普通字符,或反过来 ^ 匹配输入字符串的开始位置 $ 匹配输入字符串的结束位置 * 匹配前面的零次或多次的子表达式 + 匹配前面的一次或多次的子表达式 ? 匹配前面的零次或一次的子表达式 {n} n是一个非负整数,匹配前面的n次子表达式 {n,} n是一个非负整数,至少匹配前面的n次子表达式 {n,m} m和n均为非负整数,其中n<=m,最少匹配n次且最多匹配m次 ? 当该字符紧跟在其他限制符(*,+,?

  • C#正则表达式Regex类的常用匹配

    使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 利用Regex类实现验证 示例1:注释的代码所起的作用是相同的,不过一个是静态方法,一个是实例方法 var source = "刘备关羽张飞孙权何问起"; //Regex regex = new Regex("孙权"); //if (regex.IsMatch(source)) //{ // Console.WriteLine("字符串中包含有敏感

  • C#正则表达式之Regex类用法详解

    Regex 类表示不可变(只读)的正则表达式.它还包含各种静态方法,允许在不显式创建其他类的实例的情况下使用其他正则表达式类. 正则表达式基础概述 什么是正则表达式 在编写字符串的处理程序时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码. 通常,我们在使用WINDOWS查找文件时,会使用通配符(*和?).如果你想查找某个目录下的所有Word文档时,你就可以使用*.doc进行查找,在这里,*就被解释为任意字符串.和通配

  • C#的正则表达式Regex类使用简明教程

    C#中为正则表达式的使用提供了非常强大的功能,这就是Regex类.这个包包含于System.Text.RegularExpressions命名空间下面,而这个命名空间所在DLL基本上在所有的项目模板中都不需要单独去添加引用,可以直接使用. 1.定义一个Regex类的实例 复制代码 代码如下: Regex regex = new Regex(@"\d"); 这里的初始化参数就是一个正则表达式,"\d"表示配置数字. 2.判断是否匹配 判断一个字符串,是否匹配一个正则表

  • C#正则表达式Regex类用法实例分析

    本文实例讲述了C#正则表达式Regex类用法,分享给大家供大家参考.具体实现方法如下: 一.在C#中,要使用正则表达式类,请在源文件开头处添加以下语句: 复制代码 代码如下: using System.Text.RegularExpressions; 二.RegEx类常用的方法 1.静态Match方法 使用静态Match方法,可以得到源中第一个匹配模式的连续子串. 静态的Match方法有2个重载,分别是 复制代码 代码如下: Regex.Match(string input, string pa

  • 详解C#正则表达式Regex常用匹配

    使用Regex类需要引用命名空间:using System.Text.RegularExpressions; 一.利用Regex类实现验证 示例1:注释的代码所起的作用是相同的,不过一个是静态方法,一个是实例方法 var source = "刘备关羽张飞孙权何问起"; //Regex regex = new Regex("孙权"); //if (regex.IsMatch(source)) //{ // Console.WriteLine("字符串中包含有

  • C#正则表达式Regex用法详解

    目录 一.正则表达式应用举例 1.C#校验合法性: 2.C#限制输入 3.正则表达式匹配闭合HTML标签(支持嵌套) 1.分组构造 2.举例: 二..Net正则表达式测试器 1.功能简介 2.下载与安装 3.界面截图 三..NET正则表达式Regex 1.IsMatch(Input,patter[,options]) 否则匹配 1.正则表达式选项:RegexOptions 2.内联标志 2.Match(Input,patter[,options]) 单个匹配 3.Matches(Input,pa

  • 正则表达式grep用法详解

    语法:grep 选项 'word' filename -c:打印符合要求的行数 -i:不区分大小写 -n:在输出符合要求的行的同时显示行号 -v:打印不符合要求的行 -A:后跟一个数字n,表示打印符合要求的行以及下面n行 -B:后跟一个数字n,表示打印符合要求的行以及上面n行 -C:后跟一个数字n,表示打印符合要求的行以及上下各n行 -r:会把目录下所有的文件全部遍历 --color:把匹配到的关键词用红色标示 例子: 过滤出带有某个关键词的行并输出行号 grep -n 'root' 1.txt

  • JS中正则表达式全局匹配模式 /g用法详解

    本文章来详细介绍js中正则表达式的全局匹配模式 /g用法,代码如下: var str = "123#abc"; var re = /abc/ig; console.log(re.test(str)); //输出ture console.log(re.test(str)); //输出false console.log(re.test(str)); //输出ture console.log(re.test(str)); //输出false 在创建正则表达式对象时如果使用了"g&q

  • 正则表达式用法详解

    正则表达式之基本概念 在我们写页面时,往往需要对表单的数据比如账号.身份证号等进行验证,而最有效的.用的最多的便是使用正则表达式来验证.那什么是正则表达式呢? 正则表达式(Regular Expression)是用于描述一组字符串特征的模式,用来匹配特定的字符串. 它的应用非常广泛,特别是在字符串处理方面.其常见的应用如下: 验证字符串,即验证给定的字符串或子字符串是否符合指定的特征,例如,验证是否是合法的邮件地址.验证是否是合法的HTTP地址等等. 查找字符串,从给定的文本当中查找符合指定特征

  • 正则表达式中问号(?)的正确用法详解

    目录 1.直接跟随在子表达式后面 2.非贪婪匹配 3.非获取匹配 4.断言 参考资料: 正则表达式中“?”的用法大概有以下几种 1.直接跟随在子表达式后面 这种方式是最常用的用法,具体表示匹配前面的一次或者0次,类似于{0,1},如:abc(d)?可匹配abc和abcd 2.非贪婪匹配 关于贪婪和非贪婪,贪婪匹配的意思是,在同一个匹配项中,尽量匹配更多所搜索的字符,非贪婪则相反.正则匹配的默认模式是贪婪模式,当?号跟在如下限制符后面时,使用非贪婪模式(*,+,?,{n},{n,},{n,m})

  • Python正则表达式中group与groups的用法详解

    目录 1 .group函数 1.1 返回整个匹配结果 1.2 返回指定分组的匹配结果 1.3 处理没有匹配结果的情况 2. groups函数 3. group和groups的使用场景 在Python中,正则表达式的group和groups方法是非常有用的函数,用于处理匹配结果的分组信息.group方法是re.MatchObject类中的一个函数,用于返回匹配对象的整个匹配结果或特定的分组匹配结果.而groups方法同样是re.MatchObject类中的函数,它返回的是所有分组匹配结果组成的元组

  • Python正则表达式re.search()用法详解

    re.search():匹配整个字符串,并返回第一个成功的匹配.如果匹配失败,则返回None pattern: 匹配的规则, string : 要匹配的内容, flags 标志位 这个是可选的,就是可以不写,可以写, 比如要忽略字符的大小写就可以使用标志位 flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为: re.I 忽略大小写 re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境 re.M 多行模式 re.S 即为 . 并且包括换行符

  • Python正则表达式re.sub()用法详解

    目录 1.匹配单个数字或字母 2.匹配多个数字或字母 3.匹配其他 总结 源代码.参数及其意义: def sub(pattern, repl, string, count=0, flags=0): """Return the string obtained by replacing the leftmost non-overlapping occurrences of the pattern in string by the replacement repl. repl ca

  • Java之Pattern.compile函数用法详解

    除了Pattern Pattern.compile(String regex), Pattern类的compile()方法还有另一个版本: Pattern Pattern.complie(String regex,int flag),它接受一个标记参数flag,以调整匹配的行为. flag来自以下Pattern类中的常量: 编译标记 效果 Pattern.CANON_EQ 两个字符当且仅当它们的完全规范分解相匹配时,就认为它们是匹配的,例如,如果我们指定这个标记,表达式a\u030A就会匹配字符

  • 关于日期正则表达式的思路详解

    1        概述 首先需要说明的一点,无论是Winform,还是Webform,都有很成熟的日历控件,无论从易用性还是可扩展性上看,日期的选择和校验还是用日历控件来实现比较好. 前几天在CSDN多个版块看到需要日期正则的帖子,所以整理了这篇文章,和大家一起讨论交流,如有遗漏或错误的地方,还请大家指正. 日期正则一般是对格式有要求,且数据不是直接由用户输入时使用.因应用场景的不同,写出的正则也不同,复杂程度也自然不同.正则的书写需要根据具体情况具体分析,一个基本原则就是:只写合适的,不写复杂

随机推荐