正则表达式

作者: 韦德国际1946国际网址  发布:2019-05-28

转自:

正则表达式。.NET中的正则表达式是处在 System.Text.RegularExpressions 命名空间中的,该命名空间提供了正则表明式的各类强大的作用。

1,@

   【量词】,以文害辞正是用来协作数量的。类似于w,d,[0-9]这样的元字符都只可以协作几个字符,要是要协作七个字符就要输入此元字符数十次,那样使用起来就很辛苦。所以正则表明式中央银行使了量词来进行【元字符】的数码的合营,通过操作量词,能够相配0个元字符,也足以包容无数个元字符。在正则表达式中的量词分为两种,相配优先量词(规范量词)忽略优先量词攻下优先量词。此文重视描述匹配优先量词(规范量词),那类量词是在全数的正则表明式工具中都支持的量词,而忽视优先量词和占领优先量词则只在有的正则工具中协助。其贰会提到一些大要优先量词。对于私吞优先量词,在此文中不关乎教学,据有优先量词和恒定分组的剧情有关。

又再一次学了一遍C#的正则表达式,温故而知新,C#的正则就用一句话回顾吧:很好很有力! 这里做个笔记,笔记的相干内容超过二分之壹摘自MSDN。

用的较多的类有:Group、GroupCollection、Match、MatchCollection、Regex

禁绝转义CS字符串

   在地点谈起的合作优先量词)忽视优先量词骨子里也正是我们说的正则表明式中的贪心格局非贪婪方式,我们先是初叶规范量词的任课

Regex 类表示不可变(只读)的正则表明式。它还蕴藏各类静态方法,允许在不显式创制其余类的实例的事态下使用其余正则表明式类。

Regex 类表示不可变的正则表明式。

二,字符转义

十一分优先量词

   相配优先量词有那么多少个*、 、?、{num,num},相称优先的意趣便是,它会尽量多的协作。大家先来简化一下熟谙一下种种量词的含义,全体的量词相称都有贰个所谓的上限和下限

   *,星号的下限是【0】,上限是【Infiniti】,那就表示星号最少能够不相配字符,最多能够包容无数个字符

    ,加号的下限是【一】,上限是【Infiniti】,即加号最少必须合作3个字符,最多能够同盟无数个字符

   ?,问号的下限是【0】,上限是【壹】,即问号最少能够不相配字符,最多能相称叁个字符

   {num,num},这种结构能够被称作计数量词,它的上下线由表明式来调整,譬喻{五,10}代表着下限是【5】,上限是【十】,即最少要同盟七个字符,最多能相配13个字符。

   量词所相称的原委是量词左边的元字符代表的内容,举例:

   正则表明式:d

   元字符d表示3个数字,上边的正则表达式的乐趣便是,最少要合营二个数字,最多能够相称无数个相连的数字。假诺文本为【一】,则能合营成功,相配内容为【1】。假诺文本为【22334455】,也能相配成功,相称的公文的公文是【22334455】。假如文本为【一九9三年二月6日】,也能相配成功,相称出来的内容是【一玖9一】【8】【四】多少个内容

   下边再举一个有关计数量词的例子

   正则表明式:{5,10}

   若是文本为【1玖玖1080肆】,则足以包容成功,相称文本为【一9玖一0804】。假设文本是【一九9三年五月五日】,则无从同盟成功,因为该正则至少必要十三分伍个不休的字符,而在此文件中不设有这么的字符串。即使文本为【1872233445五】,能相称成功,相配内容为【18722334四伍】,最终3个字符【伍】未有匹配到的来由是该正则的上限是10,最七只可以协作11个不休的字符串

   下边来举贰个有些有一点点难度的事例,这些例子涉及到一些正则表明式相配原理的关于于交还的内容。

   正则表达式:d*3

   下边那几个正则表明式的意趣是,不管相配多少个数字字符,不过最终一个字符必须为三。假如文本为【11224455】,则非凡不成功,因为即便d*能相称全数的数字字符,但是最后的三不能找到相应相配,所以相称不成功。假若文本为【123456】,能合营成功,相称的公文为【1二三】。

   那么对于如此的正则,相配的时候是怎么开始展览的?那就要涉及到交换那么些概念。调换的意思乃是,当在全文的相配中(即全体的正则),当非必须同盟的(比方 ,能够同盟二个,也得以包容一个,所以相称二当中的第贰个也足以不用分外,那正是非必须同盟)表明式遇上必须协作的表明式时,必须合营的表明式就能够强迫非必须表明式实行交还

   在下边包车型客车事例d*三中,非必须的表明式便是d*,而必须的表明式正是三。在特别文本【12345陆】的时候,d*由于是合作优先的,所以会同盟完全数的字符,相配结果是【12345陆】,然后正则表明式拉动到3,那时候三未有内容可以相称了,所以强迫d*交还出终极一人字符,即字符【陆】与3拓展相配,无法协作,继续交还,再交还字符【5】,仍旧不可能协作。如此循环往复平素交还到【三】,能够相称。于是【完整的表明式】创制,相配文本【12三】。那正是全方位相配的长河。

Match 类表示正则表明式相称操作的结果。Match 类的 Match.Success 相称是或不是中标。Match.Index 返回第3个门户特别的职务。

Regex 类包蕴多少个 static 方法,这几个主意和 Regex 对象方法的效应是同样的。在 .NET Framework 二.0 版中它们有一些小差距。在.NET2.0中,将缓存透过调用静态方法而编写翻译的正则表明式,而不会缓存因而调用实例方法而编写翻译的正则表明式。暗中认可情状下,正则表明式引擎将缓存 壹五个方今利用的静态正则表达式。因而在时时用到1组固定的正则表达式时,宜利用静态方法。

一大半重中之重的正则表明式语言运算符都是非转义的单个字符。转义符 (单个反斜杠)文告正则表明式分析器反斜杠前边的字符不是运算符。比如,分析器将星号 (*) 视为重复限定符,而将后跟星号的反斜杠 (*) 视为 Unicode 字符 002A。

大体优先量词

   忽略优先量词刚好与合营优先量词相反,忽略优先量词的情致是尽只怕少的协作,即尽大概以杰出下限来合营。忽略优先量词是*?、 ?、??、{num,num}?他们的上下线和相配优先量词同样,它们的构造也正好是在十分优先量词之后加上了二个【?】。上边先看四个事例:

   正则表明式:ab??

   正则表明式:如若文本是【ab】,上面包车型地铁正则表达式所相配的始末是【a】,因为它是忽视优先的,它10分到【b】的时候,首先会选拔忽略。而只要正则表明式是ab?,则相配的文本会是【ab】,因为那时的【b】是相称优先的,它会首先接纳合营。这几个事例表明了忽略优先和同盟优先的分裂。再举四个稍复杂些的,也事关到强迫交还概念的事例

   正则表明式:ab??c

   相称的文书为【abc】,这里会合营的结果是【abc】。相称进程是如此的:首先正则a相配字符【a】,能够合作,继续现在,正则b??是忽视优先的,暂不相称字符。继续将来,正则c相称文本中的字符【b】(刚才从不开始展览过相配,所以文本的指针记录还在文本b处),c与【b】不恐怕合营。那时候,并不会合营战败,表明式的引擎会回溯到b??处,尝试与公事【b】相配,能够相配。继续正则c与字符【c】进行相配,能够合营,所以相称的结果是【abc】。

   上边这么些事例中涉嫌3个新的概念回溯,回溯是唯有在NFA引擎中才干备的机能,有关于NFA引擎和回想,会在继续疏解。


   参考:《精晓正则表达式》


MatchCollection 类表示成功的【非重叠】相称项的行列。MatchCollection 的实例是由 Regex.Matches 方法回来的。

注意:你能够经过设置静态属性 Regex.CacheSize 来动态改动已编写翻译的正则表明式的脚下静态缓存中的最大项数。

下表中列出的字符转义在正则表明式和替换格局中都会被识别。

GroupCollection 类表示被破获的组的群集,并在单个相配项中回到该捕获组的集合。GroupCollection 的实例在 Match.Groups 属性回到的联谊中回到。

 

相似字符 除 . $ ^ { [ ( | ) * ? 外,其余字符与自个儿相配。
a 与响铃(警报)u0007 匹配。
b 如果在 [] 字符类中,则与退格符 u000捌 转义字符 b 是3个特例。在正则表明式中,b 表示单词边界(在 w 和 W 之间),不过,在 [] 字符类中,b 代表退格符。在轮换格局中,b 始终代表退格符。
t 与 Tab 符 u0009 匹配。
r 与回车符 u000D 匹配。
v 与垂直 Tab 符 u000B 匹配。
f 与换页符 u000C 匹配。
n 与换行符 u000A 匹配。
e 与 Esc 符 u001B 匹配。
\040 将 ASCII 字符相配为八进制数(最多四个人);要是未有前导零的数字唯有壹人数也许与捕获组号相呼应,则该数字为后向引用。(有关更多消息,请参见反向引用。) 举例,字符 \040 表示空格。
x20 使用十陆进制表示方式(恰好两位)与 ASCII 字符相配。
cC 与 ASCII 调整字符相称;比方,cC 为 Ctrl-C。
u0020 使用十6进制表示形式(恰好2个人)与 Unicode 字符相配。
在后头带有不识别为转义符的字符时,与该字符相配。举例,* 与 x2A 相同。

CaptureCollection 类表示捕获的子字符串的连串,并再次来到由单个捕获组所实施的捕获集。由于限定符,捕获组可以在单个相配中捕获八个字符串。Captures 属性(CaptureCollection 类的靶子)作为 Match 和 Group 类的成员提供,目标是便利对捕获的子字符串的群集进行走访。

关李林则表达式的 字符类 ,在此就不作详细介绍。只列出多少个常用的。

3,替换

Group 类表示来自单个捕获组的结果。因为 Group 能够在单个相配中捕获零个、三个或更加多的字符串(使用限定符),所以它包括Capture 对象的聚众。因为 Group 承接自 Capture,所以能够平素访问最终捕获的子字符串(Group 实例本人等价于 Captures 属性重临的集纳的结尾壹项)。

字符类 说明
[字符分组] 匹配指定字符分组内的任一字符。
[^字符分组] 匹配不在指定字符分组内的任一字符。
[第一个字符-最后一个字符] 匹配字符范围中的任一字符。
w 与任何单词字符匹配。等效于 [a-zA-Z_0-9]。其中"_"表示字符"_"本身。
W 与任何非单词字符匹配。等效于 [^a-zA-Z_0-9]。
s 与任何空白字符匹配。等效于[ fnrtv]。注意在"f"前有一个空格。
S 与任何非空白字符匹配。等效于[^ fnrtv]。
d 与任何十进制数字匹配。等效于[0-9]。
D 与任何非数字字符匹配。等效于[^0-9]。

只在轮换格局中允许替换。对彭三源则表明式中的类似意义,使用后向引用(如 一)。有关后向引用的详细音信,请参见 反向引用 和后向引用构造。

Capture 类蕴含来自单个子表明式捕获的结果。

下边先介绍Regex 类的常用方法和品质。

字符转义和替换是在轮换形式中识其余唯1的奇特结构。上面几局地讲述的持有语法构造只允许出现在正则表达式中;替换格局中不识别它们。举个例子,替换情势a*${txt}b 会插入字符串“a*”,该字符串后跟按 txt 捕获组相称的子字符串,该子字符串后跟字符串“b”(假如有)。在轮换形式中,* 字符不会识别为元字符。与此类似,在正则表明式相配格局中不识别 $ 情势。在正则表达式中,$ 钦点字符串的终极。

为了越来越好地知道下面类的彼此关系,笔者把msdn的亲自过问扩张了弹指间:

  • 方法

下表展现怎么定义命名并编号的替换方式。

using System;
using System.Text.RegularExpressions;

/// <summary>
/// 2008-10-07 copyright 可爱的猴子
/// http://www.dreamdu.com/blog/
/// </summary>
public class RegexTest
{
   public static void Main()
   {
       Regex r = new Regex("(Abc) ");
       string str = "XYZAbcAbcAbcXYZAbcAb";
       MatchCollection mc = r.Matches(str);
       Console.WriteLine("---------------------Group-------MatchCollection={0}", mc.Count);
       foreach (Match mt in mc)
       {
           Console.WriteLine("match = {0}", mt.Value);
           Console.WriteLine("--------------Group={0}", mt.Groups.Count);
           foreach (Group gc in mt.Groups)
           {
               Console.WriteLine("Group value is:{0}.    Index is:{1}",gc.Value, gc.Index);
               Console.WriteLine("-------Gapture={0}",gc.Captures.Count);
               foreach (Capture gg in gc.Captures)
               {
                   Console.WriteLine("Capture value is:{0}.  Index is:{1}",gg.Value, gg.Index);
               }
           }
       }

       Console.WriteLine("---------------------Capture-------MatchCollection={0}",mc.Count);
       foreach (Match mt in mc)
       {
           Console.WriteLine("match = {0}",mt.Value);
           Console.WriteLine("--------------Capture={0}",mt.Captures.Count);
           foreach (Capture gc in mt.Captures)
           {
               Console.WriteLine("Group value is:{0}.    Index is:{1}",gc.Value, gc.Index);
           }
       }

       Match m = r.Match(str);
       GroupCollection gcc = m.Groups;
       Console.WriteLine("--------------------------------GroupCollection={0}",gcc.Count);
       foreach (Group gt in gcc)
       {
           CaptureCollection cc = gt.Captures;

           Console.WriteLine("--------------Captures={0}",cc.Count);
           foreach (Capture ccnp in gt.Captures)
           {
               Console.WriteLine("Capture value is:{0}.    Index is:{1}",ccnp.Value, ccnp.Index);
           }
       }

       CaptureCollection ccn = m.Captures;
       Console.WriteLine("--------------------------------CaptureCollection={0}",ccn.Count);
       foreach (Capture gt in ccn)
       {
           Console.WriteLine("Capture value is:{0}.    Index is:{1}",gt.Value, gt.Index);
       }
   }
}
名称 说明
IsMatch 已重载。 指示正则表达式在输入字符串中是否找到匹配项。
Match 已重载。 在输入字符串中搜索正则表达式的匹配项,并将第一个精确结果作为单个 Match 对象返回。
Matches 已重载。 在输入字符串中搜索正则表达式的所有匹配项并返回所有成功的匹配,就像多次调用 Match 一样。
Replace 已重载。 在指定的输入字符串内,使用指定的替换字符串替换与某个正则表达式模式匹配的字符串。
Split 已重载。 在由正则表达式匹配项定义的位置将输入字符串拆分为一个子字符串数组。
  • 属性
名称 说明
CacheSize 获取或设置已编译的正则表达式的当前静态缓存中的最大项数。
Options 返回传入 Regex 构造函数的选项。
RightToLeft 获取一个值,该值指示正则表达式是否从右向左进行搜索。

其间Options是RegexOptions 枚举,它提供用于安装正则表明式选项。

小心此选项并非只好选其壹,而是可以通过按位或标记"|"完成七个选用,比如:RegexOptions.Compiled | RegexOptions.IgnoreCase 是讲求正则表明式既要编写翻译为程序集,又要不经意大小写。

字符 说明

 

下边将经超过实际例来介绍各样方法的利用。

$ 数字 替换按组号 number(10进制)相称的最后三个子字符串。
${name} 替换由 (? ) 组相称的末梢3个子字符串。
$$ 替换单个“$”字符。
$& 替换完全协作自个儿的3个别本。
$` 替换相配前的输入字符串的有所文件。
$’ 替换匹配后的输入字符串的兼具文件。
$ 替换最后捕获的组。
$_ 替换整个输入字符串。

 返回结果

---------------------Group-------MatchCollection=2  match = AbcAbcAbc  --------------Group=2  Group value is:AbcAbcAbc.    Index is:3  -------Gapture=1  Capture value is:AbcAbcAbc.  Index is:3  Group value is:Abc.    Index is:9  -------Gapture=3  Capture value is:Abc.  Index is:3  Capture value is:Abc.  Index is:6  Capture value is:Abc.  Index is:9  match = Abc  --------------Group=2  Group value is:Abc.    Index is:15  -------Gapture=1  Capture value is:Abc.  Index is:15  Group value is:Abc.    Index is:15  -------Gapture=1  Capture value is:Abc.  Index is:15  ---------------------Capture-------MatchCollection=2  match = AbcAbcAbc  --------------Capture=1  Group value is:AbcAbcAbc.    Index is:3  match = Abc  --------------Capture=1  Group value is:Abc.    Index is:15  --------------------------------GroupCollection=2  --------------Captures=1  Capture value is:AbcAbcAbc.    Index is:3  --------------Captures=3  Capture value is:Abc.    Index is:3  Capture value is:Abc.    Index is:6  Capture value is:Abc.    Index is:9  --------------------------------CaptureCollection=1  Capture value is:AbcAbcAbc.    Index is:3  
  • Regex.IsMatch 方法——当您只想验证格式是还是不是适合时用此措施
  using System;
  using System.Text.RegularExpressions;
  public class RegexTest
  {
      public static void Main()
      {
      string str = "ab cb db bb";
      string pattern = @"(?<txt>b{1})";
      foreach (Match m in Regex.Matches(str,pattern))
      {
          Console.WriteLine("{0}--{1}",m.Value, m.Index);
      }
      //str = Regex.Replace(str, pattern, "a*${txt}");
      str = Regex.Replace(str, pattern, "a*$1");
      Console.WriteLine(str);
      }
  }

 

图片 1图片 2 id="Code_Closed_Text_112212">IsMatch Test id="Code_Open_Text_112212">
using System;
using System.Text.RegularExpressions;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //定义用于表明正整数的表明式
            // ^ 表示从字符串的首部初阶验证
            // $ 表示从字符串的尾巴开头验证
            Regex rx = new Regex(@"^[1-9]d*$", RegexOptions.Compiled);

            double[] list ={ 12, -5, 1.2, 25697, 0, -1.1 };

            foreach (double d in list)
            {
                if (rx.IsMatch(d.ToString()))
                {
                    Console.WriteLine("数字 {0} 是正整数。", d);
                }
                else
                {
                    Console.WriteLine("数字 {0} 不是正整数。", d);
                }
            }
        }
    }
}
//输出:

//数字 1二 是正整数。
//数字 -伍 不是正整数。
//数字 壹.贰 不是正整数。
//数字 256玖柒 是正整数。
//数字 0 不是正整数。
//数字 -壹.一 不是正整数。

4,字符类

经过地方这些例子应该可以见见那多少个类的实例的关系了,其实也很轻巧,便是相互包蕴的涉及。

  • Regex.Match 方法——适合您想从一段字符串中非凡出贰个你想要的子串,并且获得那么些子串的相干新闻

字符类表示一组能够相称输入字符串的字符。组合原义字符、转义符和字符类以组合正则表明式情势。


图片 3图片 4 id="Code_Closed_Text_202455">Match Test id="Code_Open_Text_202455">
using System;
using System.Text.RegularExpressions;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //定义能匹配单词 do 的表达式
            Regex rx = new Regex(@"s dos ", RegexOptions.Compiled | RegexOptions.IgnoreCase);

            string[] source = { "How do you do !", "no one !" };

            foreach (string s in source)
            {
                Match match = rx.Match(s);

                Console.WriteLine("相称到的子串为:|{0}|n在原串的第 {壹} 个岗位n子串长度:{2}",
                    match.Value, match.Index, match.Length);
                Console.WriteLine("------------------------------");
            }
        }
    }
}
//相称到的子串为:| do |
//在原串的第 三 个职位
//子串长度:四
//------------------------------
//匹配到的子串为:||
//在原串的第 0 个岗位
//子串长度:0
//------------------------------

[字符分组] (正字符分组。) 相配钦定字符分组内的任何字符。字符分组由串连的2个或八个原义字符、转义符、字符范围或字符类组成。举个例子,若要钦点全数元音字母,使用 [aeiou]. 若要钦点全数标点符号和10进制数字符,使用代码 [p{P}d]。

可知,当未有相称项时Match对象并不会为空,而是相称到的字符串为空字符串,能够用Length属性或Value质量来判断是还是不是合营成功。

[^字符分组] (负字符分组。) 相配不在钦命字符分组内的任何字符。字符分组由串连的一个或七个原义字符、转义符、字符范围或字符类组成。前导符 (^) 是威逼的,提醒字符分组为负字符分组,而不是正字符分组。举个例子,若要内定除元音字母以外的具有字符,使用 [^aeiou]. 若要钦命除标点符号和10进制数字符以外的持有字符,使用 [^p{P}d]。

  • Regex.Matches 方法——有时你并不只是想要相称到3个适合就满意,而是要把全部满足的子串全体找寻来,那么用此形式。此情势重回三个MatchCollection集结,该集结是只读的,并且未有国有构造函数。既然是聚众,当然能够用 foreach 实行迭代,集合中存放的是Match对象

[率先个字符-最后二个字符] (字符范围。) 相配字符范围中的任何字符。字符范围是一雨后春笋接二连三的字符,定义的法子是:钦点种类中的第2个字符,连字符 (-),然后内定体系中的最后三个字符。假使五个字符具备相邻的 Unicode 位,则这四个字符是接贰连三的。可以串连三个或越来越多字符范围。比如,若要钦点从“0”至“九”的拾进制数范围、从“a”至“f”的小写字母范围,以及从“A”至“F”的大写字母范围,使用 [0-9a-fA-F]。

待续…

. (句点字符。) 相配除 n 以外的其他字符。假使已用 Singleline 选项做过修改,则句点字符可与此外字符相称。有关越来越多消息,请参见正则表明式选项。请留心,正字符分组或负字符分组中的句点字符(方括号内的句点)将被视为原义句点字符,而非字符类。


p{ 名称 } 匹配通过名称(举例 Ll、Nd、Z、IsGreek 和 IsBoxDrawing)钦点的 Unicode 通用项目或命名块中的任何字符。

P{ 名称 } 相配不在名称中钦赐的 Unicode 通用项目或命名块中的任何字符。

本文由韦德国际1946发布于韦德国际1946国际网址,转载请注明出处:正则表达式

关键词: