C#--正则表达式

正则表达式简介

正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本字符串;或将提取的字符串添加到集合以生成报告。对于处理字符串(例如HTML处理、日志文件分析和HTTP标头分析)的许多应用程序而言,正则表达式是不可缺少的工具。

正则表达式的组成

构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符将小的表达式结合在一起,创建出更为复杂的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式是由普通字符(例如字符a到z)以及特殊字符(称为“元字符”)组成的文本模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
例如,电话号码(如0992-3923932)通常由3或4位以0开头的区号和一组7或8位的数字组合而成,中间通常以连字符“-”隔开。对于本例,首先需要介绍一下元字符“\d”,它是用来匹配一个0~9的数字。这样,就可以将全国的电话号码用正则表达式写成:^0\d{2,3}-\d{7,8}KaTeX parse error: Undefined control sequence: \d at position 46: …位置;(2)0匹配数字“0”,\̲d̲匹配一个数字,表示0~9;(3…”为匹配输入字符串的结束位置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

正则表达式的优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先高后低。
表中列出了从最高到最低各种正则表达式运算符的优先级顺序。

在这里插入图片描述

正则表达式匹配规则

字符匹配

句点“.”匹配字符串中的各种打印或非打印字符,但是只有换行符“\n”例外。
例如:
/a.c/
该正则表达式匹配aac、abc、acc、adc等等,以及a1c、a2c、a-c和a#c。
若要匹配包含文件名的字符串,而句点“.”是输入字符串的组成部分,需要在正则表达式中的句点前面加反斜杠“\”字符。
例如,定义一个正则表达式用于匹配文件名FileName.txt:
/FileName.txt/

中括号表达式

若要创建匹配字符组的一个列表,需要在方括号“[”与“]”内放置一个或更多单个字符。当字符括在中括号内时,该列表称为“中括号表达式”。
使用中括号表达式需要注意以下几点:
(1) \字符继续作为转义符。若要匹配\字符,需要使用\。
(2) 括在中括号表达式中的字符,只匹配处于正则表达式中该位置的单个字符。
(3) 若要使用范围代替字符本身来表示匹配字符组,需要使用连字符“-”将范围中的开始字符和结束字符分开。单个字符的字符值确定范围内的相对顺序。

重复匹配

在更多的情况下,可能要重复匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数,如下表所示。
在这里插入图片描述

替换和分组

替换使用“|”字符来允许在两个或多个替换选项之间进行选择。
例如:
/^Chapter|Section [1-9][0-9]{0,1}$/
该正则表达式要么匹配行首的单词Chapter,要么匹配行尾的单词Section及跟在其后的任何数字。如果输入字符串是Chapter22,那么上面的表达式只匹配单词Chapter。如果输入字符串是Section 22,那么该表达式匹配Section 22。
若要使替换的正则表达式更易于控制,可以使用括号来限制替换的范围。即,确保它只应用于两个单词Chapter和Section。

正则表达式涉及的基本类

Regex类

Regex类表示只读正则表达式,它包含各种静态方法,允许在不显示创建其他类的实例的情况下,使用其他正则表达式类。
在这里插入图片描述

编写程序,使用正则表达式,匹配一个字符串。

using System;
using System.Text.RegularExpressions;
namespace Project19
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "2md13nabcttac";  //定义一个字符串str,并赋值
                                           //实例化Regex类的对象,再定义一个简单的正则表达式“abc”
            Regex regex = new Regex("abc");
            if (regex.IsMatch(str))  //通过IsMatch方法,判断字符串str是否匹配正则表达式
            {
                Console.WriteLine("字符串中包含abc");
            }
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了如何使用正则表达式匹配一个字符串。在代码中,首先定义字符串str,并赋值为“2md13nabcttac”;然后实例化Regex类的对象为regex,再定义一个简单的正则表达式“abc”;最后使用IsMatch方法在if语句中,判断字符串str中是否有字符“abc”

字符串中包含abc

Match类

Match类表示单个正则表达式匹配的结果,该类没有公共构造函数。
在这里插入图片描述下表列出了Match类的常用方法。
在这里插入图片描述

编写程序,定义一个字符串,然后调用Match(String,String)和NextMatch方法来一次检索一个匹配项。

using System;
using System.Text.RegularExpressions;
namespace Project20
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "int[] values = { 1, 2, 3 };\n" +
                      "for (int ctr = values.GetLowerBound(1); ctr <= values.GetUpperBound(1); ctr++)\n" +
                      "{\n" +
                      "   Console.Write(values[ctr]);\n" +
                      "   if (ctr < values.GetUpperBound(1))\n" +
                      "      Console.Write(\", \");\n" +
                      "}\n" +
                      "Console.WriteLine();\n";
            string pattern = @"Console\.Write(Line)?";
            //实例化Match类的对象为match,并返回的Regex.Match的方法中
            Match match = Regex.Match(str, pattern);
            //如果匹配成功,循环进行输出
            while (match.Success)
            {
                Console.WriteLine("\"" + "{0}" + "\"" + "在位置的源代码中找到 {1}.",
                                  match.Value, match.Index);
                match = match.NextMatch();
            }
            Console.ReadKey();
        }
    }
}

【程序分析】本例演示了Match类的使用。在代码中,首先声明了一个字符串input并为其赋值;然后再定义一个字符串pattern,用于匹配str中所有字符串“Console.Write(Line)”的位置;接着,实例化Match类的对象为match,并返回到Regex.Match的方法中,表示第一个模式匹配字符串中;最后使用while语句,循环输出与字符串“Console.Write(Line)”匹配的位置。

"Console.Write"在位置的源代码中找到 112.
"Console.Write"在位置的源代码中找到 184.
"Console.WriteLine"在位置的源代码中找到 207.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值