zoukankan      html  css  js  c++  java
  • C#(99):.NET正则表达式Regex

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

    using System.Text.RegularExpressions;

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

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

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

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

    正则表达式选项:RegexOptions

    有如下选项

    RegexOptions枚举值

    内联标志

    简单说明

    ExplicitCapture

    n

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

    IgnoreCase

    i

    不区分大小写

    IgnorePatternWhitespace

    x

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

    MultiLine

    m

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

    SingleLine

    s

    单行模式,和MultiLine相对应

    内联标志

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

    A(?i)bw+ 匹配“ABA Able Act”中的“ABA”和“Able”

    二、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

    三、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;

    四、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

    五、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+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

    六、实例化Regex类

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

  • 相关阅读:
    【对拍√】
    hdu5791 TWO
    luogu P1220 关路灯
    【NOI2001】食物链
    【HAOI2016】食物链
    luogu P1006 传纸条
    可持久化平衡树
    可持久化并查集
    线段树合并(【POI2011】ROT-Tree Rotations)
    可持久化数组
  • 原文地址:https://www.cnblogs.com/springsnow/p/9428622.html
Copyright © 2011-2022 走看看