正则表达式

正则表达式(Regular Expression),使用模式(Pattern)对文本内容进行匹配(Match),并可以进一步操作,如提取、替换文本内容等。.NET Framework中的正则表达式处理资源定义在System.Text.RegularExpressions命名空间,代码文件中注意引用。

模式

匹配特定的字符时,可以将模式定义在一对方括号中,以下转义字符表示特定类型的字符:

  • \w,单词字符,大小写英文字母、数字和下画线。
  • \W,单词字符以外的字符。
  • \s,空白字符。
  • \S,非空白字符。
  • \d,数字。
  • \D,数字以外的内容。

此外,在方括号中还可以使用连字符(-)指定范围,如[0-9]表示0到9的数字,[a-z]表示小写字母a到z。下面的代码,将匹配字符串的小写字母。

C#
using System;
using System.Text.RegularExpressions;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            string pattern = "[a-z]";
            string s = "aB986ieA64Kdfh";
            foreach(Match m in Regex.Matches(s,pattern))
            {
                Console.WriteLine(m.Value);
            }
        }
    }
}

代码会显示s字符串中的所有小写字母,执行结果如下图。

如果需要匹配指定规则以外的字符,可以在[]中的最前面添加^符号,如下面的代码会显示除大小字母以外的内容。

C#
using System;
using System.Text.RegularExpressions;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            string pattern = "[^a-zA-Z]";
            string s = "aB986i,eA6*4Kdfh";
            foreach(Match m in Regex.Matches(s,pattern))
            {
                Console.WriteLine(m.Value);
            }
        }
    }
}

代码执行结果如下图。

对于连接的内容,可以直接书写,但对于一些特殊字符,同样需要转义,如:

  • \t,制表符。
  • \n,换行符。
  • \r回车符
  • \unnnn,字符的Unicode编码。
  • \nnn,3位八进制数表示字符的编码。
  • \xnn,两位十六进制数表示字符编码。
  • \字符,转义指定的字符。

此外,在模式中还可以指定匹配内容出现的次数,如:

  • *,匹配0次或多次。
  • +,匹配1次或多次。
  • ?,匹配0次或1次。
  • {n},匹配n次。
  • {n,},匹配最少n次。
  • {n,m},匹配n到m次。
  • *?,匹配0次或多次,但尽可能少。
  • +?,匹配1次或多次,但尽可能少。
  • ??,匹配0次或1次,但尽可能少。
  • {n}?,匹配n次,但尽可能少。
  • {n,}?,匹配最少n次,但尽可能少。
  • {n,m}?,匹配n到m次,但尽可能少。

需要匹配多个格式时,可以使用|符号分隔,并可以使用一对圆括号组合模式。要求匹配内容在文本的开始部分时,应在模式前使用^符号,要求匹配内容在文本的结尾时,在模式后使用$符号,下面的代码演示了^符号和$符号的应用。

C#
using System;
using System.Text.RegularExpressions;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "abcdefg";
            Console.WriteLine(Regex.IsMatch(s, "^abc"));
            Console.WriteLine(Regex.IsMatch(s, "abc$"));
        }
    }
}

代码执行结果如下图。

需要识别独立的单词时,需要使用断字符(\b),下面的代码演示了识别关键字的基本方法。

C#
using System;
using System.Text.RegularExpressions;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            string pattern = @"\bpublic\b|\bstatic\b|\bclass\b";
            string s = "public static class classTest() {}";
            foreach (Match m in Regex.Matches(s, pattern))
            {
                Console.WriteLine(m.Value);
            }
        }
    }
}

代码执行结果如下图。

Regex类

Regex类是处理正则表达式的主类,下面讨论几个常用的方法。

IsMatch()方法返回bool类型的值,判断文本中是否有匹配模式的内容。下面的代码,用于判断一个字符串是否为6位数字(邮政编码)。

C#
using System;
using System.Text.RegularExpressions;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            string pattern = @"^[1-9][0-9]{5}?$";
            string s = "110245";
            Console.WriteLine(Regex.IsMatch(s, pattern));
        }
    }
}

Matches()方法方法返回所有匹配项,返回类型为MatchCollection,可以使用Match对象访问各个匹配项。下面的代码,用于提取文本内容中第一个字母为J或j的单词。

C#
using System;
using System.Text.RegularExpressions;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            string pattern = @"\b[J|j]\w*\b";
            string s = "Tom Jerry John Johnson Maria Smith Jim joy";
            foreach (Match m in Regex.Matches(s, pattern))
            {
                Console.WriteLine(m.Value);
            }
        }
    }
}

代码执行结果如下图。

Replace()方法可以使用指定的内容替换匹配内容。先看一个简单的示例,直接将第一个字母是J或j的单词替换为***,如下面的代码。

C#
using System;
using System.Text.RegularExpressions;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            string pattern = @"\b[J|j]\w*\b";
            string s = "Tom Jerry John Johnson Maria Smith Jim joy";
            string result = Regex.Replace(s, pattern, "***");
            Console.WriteLine(result);
        }
    }
}

代码执行结果如下图。

除了直接替换,我们还可以使用复杂的规则来替换内容,如下面的代码,我们保留第一个字母J或j,并将单词中的其它内容替换为**。

C#
using System;
using System.Text.RegularExpressions;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            string pattern = @"\b[J|j]\w*\b";
            string s = "Tom Jerry John Johnson Maria Smith Jim joy";
            string result = Regex.Replace(s, pattern, (Match m) => {
                return m.Value.Substring(0, 1) + "**";
            });
            Console.WriteLine(result);
        }
    }
}

代码执行结果如下图。

Split()方法可以使用模式分割文本内容。下面的代码,我们通过空格分隔单词,单词之间可能由一个或多个空格。

C#
using System;
using System.Text.RegularExpressions;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            string pattern = @"[ ]+";
            string s = "Tom  Jerry John  Maria   Smith  Jim   joy";
            string[] result = Regex.Split(s, pattern);
            foreach(string word in result)
                Console.WriteLine(word);
        }
    }
}

代码执行结果如下图。

从以上一些简单的示例中,我们可以看到正则表达式的功能是非常强大的,如果需要处理大量的文本,大家可以根据需要深入学习正则表达式的应用。

本站内容均为原创作品,转载请注明出处,本页面网址为:http://caohuayu.com/chy/article/Article.aspx?code=cc002015