中使用正则表达式完结字符串的查找,查找字符

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

**4、利用正则表明式完结字符串搜索

摘要:本文给出了在C#下使用正则表明式完毕字符串搜索效果的艺术,通过对.NET框架下的正则表达式的钻研及实例深入分析,计算了正则表明式的元字符、规则、选项等。

/*    题目    1)简介    输入:正则表达式字符串 待匹配字符串,如果输入”### ###”程序终止,  输出:如匹配成功,输出整个字符串,如果匹配不成功,输出lost,然后等待下一次用户的输入。    ^ 代表字符串开始  . 代表任意字符  $ 代表字符串末尾    2)参考输入,输出    ^a.$ abc ←regular express and target string (separate by space),input  lost ←result, output  ab.$ ababc ←regular express and target string (separate by space), input  ababc ←match successfully, print the target string, output  ### ### ←input ### ### 结束整个程序      */  #include <stdio.h>  #include <string.h>  #define X 20  int main()  {      int i,j,x1,x2,u,flag,ret,w;      char str1[X],str2[X];        for(u=0;;u  )      {          scanf("%s",str1);          scanf("%s",str2);          x1=strlen(str1);          x2=strlen(str2);              flag=0;          if(x1==3&&x2==3)          {              for(i=0;i<3;i  )              {                  if(str1[i]!='#'||str2[i]!='#')                      flag  ;              }              if(flag==0)                  return 0;          }            if(str1[0]=='^')/*1&2*/          {              if(str1[x1-1]=='$')              {                  if(x1==x2 2)                      for(i=1;i<x1-1;i  )                      {                          if(str1[i]!='.')                          {                              if(str1[i]!=str2[i-1])                              {                                  printf("lostn");                                  break;                              }                              else                              {                                  if(i==x1-2)                                  {                                      puts(str2);                                      break;                                  }                              }                          }                          else                              continue;                      }                  else                      printf("lostn");              }                  else/*2*/              {                  if(x2<x1-1)                      printf("lostn");                  else                      for(i=1;i<x1;i  )                      {                          if(str1[i]!='.')                          {                              if(str1[i]!=str2[i-1])                              {                                  printf("lostn");                                  break;                              }                              else                                  if(i==x1-1)                                  {                                      puts(str2);                                      break;                                  }                          }                          else                              continue;                      }              }          }                else/*3&4*/          {              if(str1[x1-1]=='$')/*3*/              {                  if(x2<x1-1)                      printf("lostn");                  else                  {                      for(i=x1-2;i>=0;i--)                      {                          if(str1[i]!='.')                          {                              if(str1[i]!=str2[x2-x1 i 1])                              {                                  printf("lostn");                                  break;                              }                              else                              {                                  if(i==0)                                  {                                      puts(str2);                                      break;                                  }                              }                          }                      }                  }              }                                else/*4*/              {                  ret = 0;                  if(x1>x2)                      printf("lostn");                  else                  {                      for(w=0;w<x1;w  )                          if(str1[w]!=0)                              break;                          for(j=w;j<x2;j  )                          {                              if(str1[w]==str2[j])                                  for(i=1;i<x1-w;i  )                                  {                                      if(str1[i w]!='.')                                      {                                          if(str1[i w]!=str2[i j])                                              break;                                          else                                          {                                              if(i w==x1-1)                                              {                                                  ret=1;                                                  puts(str2);                                              }                                          }                                      }                                  }                                  if(ret==1)                                      break;                          }                          if(ret!=1)                              printf("lostn");                  }              }          }          }      return 0;  }

**1、正则表明式简要介绍

**  4.1 在C#中使用.NET一般表明式引擎

  关键字:正则表明式、元字符、字符串、相配
        一、正则表明式简要介绍


**  正则表明式提供了功能庞大、灵活而又相当的慢的办法来管理公事。正则表达式的无一不备形式相配表示法可以火速地深入分析大气的公文以找到一定的字符方式;提取、编辑、替换或删除文本子字符串;或将提取的字符串增多到集合以生成告诉。对于拍卖字符串(举例HTML 管理、日志文件剖析和 HTTP 标头剖判)的大队人马应用程序而言,正则表明式是不足缺点和失误的工具。

  上边将经过3个样例的支出,推行并出示一些寻觅的结果,说美赞臣(Meadjohnson)般表明式的一些特色,以及怎么着在C#中使用.NET一般表明式引擎。表达使用字符串时应在前头加上暗号@。

  正则表明式提供了成效庞大、灵活而又急速的法门来拍卖文件。正则表达式的健全格局相配表示法能够便捷地解析大气的公文以找到特定的字符形式;提取、编辑、替换或删除文本子字符串;或将领到的字符串加多到会集以生成告诉。对于拍卖字符串(比方HTML 管理、日志文件剖析和 HTTP 标头解析)的众多应用程序来讲,正则表明式是不足缺点和失误的工具。

  .NET 框架正则表明式并入了别样正则表明式达成的最常见成效,被规划为与 Perl 五 正则表明式包容,.NET 框架正则表明式还包蕴一些在其余实现中并未有提供的成效,.NET 框架正则表明式类是基类库的1局部,并且能够和面向国有语言运营库的其他语言或工具一同行使。

String Text=@"I can not find my position in Beijing";

  .NET 框架正则表明式并入了其他正则表明式实现的最常见成效,被设计为与 Perl 伍 正则表明式包容,.NET 框架正则表明式还包含部分在其他实现中从不提供的意义,.NET 框架正则表明式类是基类库的一片段,并且能够和面向国有语言运维库的此外语言或工具一齐利用。

  贰、字符串寻找中使用正则表达式完结字符串的查找,查找字符串相称。

  把那个文件称为输入字符串,为了印证一般表明式.NET类,本文先举行贰回纯文本的追寻,本次寻觅不带任何转义种类或一般表达式命令。假定要寻觅全体字符串ion,把那个搜索字符串称为情势。使用相似表明式和地方注脚的变量Text,编写出上面包车型客车代码:

  二、字符串寻找

  正则表达式语言由二种基本字符类型组成:原义(平常)文本字符和元字符。就是元字符组为正则表明式提供了拍卖本事。当前,全数的文本编辑器都有一点招来效果,经常能够张开3个会话框,在在那之中的3个文本框中键入要定点的字符串,就算还要同一时间展开替换操作,能够键入一个交流字符串,比方在Windows操作系统中的记事本、Office体系中的文书档案编辑器都有这种效果。这种找寻最简便易行的点子,那类难题很轻巧用String类的String.Replace()方法来化解,但倘若要求在文书档案中识别有些重复的,该如何做?编写2个例程,从贰个String类中选拔重新的字是相比较复杂的,此时采取语言就很合乎。

String Pattern = "ion";
MatchCollection Matches = Regex.Matches(Text,Pattern,RegexOptions);
foreach(Match NextMatch in Matches)
{ Console.WriteLine(NextMatch.Index); }

  正则表达式语言由二种基本字符类型组成:原义(寻常)文本字符和元字符。正是元字符组为正则表明式提供了管理技艺。当前,全部的公文编辑器都有一点点寻觅功能,经常能够展开三个对话框,在里边的2个文本框中键入要定位的字符串,假设还要同期拓展调换操作,可以键入贰个沟通字符串,例如在Windows操作系统中的记事本、Office连串中的文书档案编辑器都有这种意义。这种搜索最简单易行的章程,这类难题很轻易用String类的String.Replace()方法来缓慢解决,但倘使急需在文书档案中识别有个别重复的,该如何是好?编写3个例程,从二个String类中采纳重新的字是比较复杂的,此时选用语言就很合乎。

  一般表明式语言是壹种能够编制寻找表达式的言语。在该语言中,能够把文书档案中要寻觅的文本、转义体系和一定含义的其余字符组合在同步,举个例子种类b表示2个字的开始和末段(子的疆界),要是要表示正在探求的以字符th开头的字,就足以编制一般表明式bth(即系列字符界是-t-h)。若是要物色全数以th结尾的字,就足以编写thb(系列t-h-字边界)。可是,一般说明式要比那纷纷得多,例如,能够在探求操作中找到存储部分文件的工具性程序(facility)。

  在这段代码中,使用了System.Text.RegularExpressions名称空间中Regex类的静态方法Match()。这一个格局的参数是有的输入文本、3个方式和RegexOptions每句中的壹组可选标识。Matches()重回MatchCollection,每一个相配都用三个Match对象来表示。在上头的代码中,只是在联谊中迭代,使用Match类的Index属性,重临输入文本中相配所在的目录。运营这段代码,将得到1个相称项。

  一般表达式语言是一种能够编写制定寻找表明式的语言。在该语言中,能够把文书档案中要搜索的文书、转义体系和一定含义的其它字符组合在联合,举个例子连串b表示贰个字的初叶和最终(子的界线),假若要代表正在搜寻的以字符th开始的字,就能够编写一般表明式bth(即系列字符界是-t-h)。假设要物色全部以th结尾的字,就足以编制thb(类别t-h-字边界)。然而,一般表明式要比那纷纭得多,比如,能够在探索操作中找到存款和储蓄部分文件的工具性程序(facility)。

  叁、.NET 框架的正则表明式类

  一般集合的功能主要取决于方式字符串。原因是形式字符串不止包涵纯文本。如前所述。还富含元字符和转义连串,元字符是给出命令的特殊字符,而转义系列的职业章程与C#的转义体系一样,它们都以以反斜杠始发的字符,具备特种的意义。例如,假定要查找以n先河的字,就足以采纳转义种类b,它意味着贰个字的境界(字的境界是以某些字母数字标的字符初阶,也许后边是八个空白字符或标点),上面编辑如下代码:

  3、.NET 框架的正则表达式类

  下边通过介绍 .NET 框架的正则表明式类,纯熟一下.NET框架下的正则表明式的施用情势。

String Pattern = @"bn";
MatchCollection Matches = Regex.Matches(Text,Pattern,RegexOptions.IgnoreCase|
RegexOptions.ExplicitCapture);

  下边通过介绍 .NET 框架的正则表明式类,熟识一下.NET框架下的正则表明式的使用方法。

  3.一 Regex 类表示只读正则表明式

  要在运作时把b传递给.NET一般表明式引擎,反斜杠不应被C#编写翻译器解释为转义系列。如若要探寻以系列ion结尾的字,能够采取下边的代码:

  三.壹 Regex 类表示只读正则表明式

  Regex 类包涵各样静态方法,允许在不显式实例化别的类的对象的情状下行使任何正则表明式类。以下代码示例创设了 Regex 类的实例并在开始化对象时定义多个总结的正则表明式。请留意,使用了增大的反斜杠作为转义字符,它将 s 相称字符类中的反斜杠钦赐为原义字符。

String Pattern = @"ionb";

  Regex 类包蕴种种静态方法,允许在不显式实例化其余类的对象的景观下行使此外正则表明式类。以下代码示例创建了 Regex 类的实例并在起先化对象时定义一个简练的正则表明式。请留心,使用了增大的反斜杠作为转义字符,它将 s 相配字符类中的反斜杠内定为原义字符。

Regex r; // 声明一个 Regex类的变量
r = new Regex("\s2000"); // 定义表达式

  借使要找出以字母n先导,以体系ion结尾的享有字,必要二个以bn开头,以ionb结尾的形式,中间内容如何做?须求告诉Computern和ion中间的内容能够是随意长度的字符,只要字符不是空白就能够,精确的格局如下所示:

Regex r; // 声明一个 Regex类的变量
r = new Regex("\s2000"); // 定义表达式

  三.2 Match 类表示正则表达式相配操作的结果

String Pattern = @"bnS*ionb";

  3.贰 Match 类表示正则表达式匹配操作的结果

  以下示例使用 Regex 类的 Match 方法重回 Match 类型的靶子,以便找到输入字符串中首先个门当户对。此示例使用 Match 类的 Match.Success 属性来提示是或不是已找到匹配。

  4.二 特定字符或转义种类

  以下示例使用 Regex 类的 Match 方法重回 Match 类型的对象,以便找到输入字符串中率先个地位相当。此示例使用 Match 类的 Match.Success 属性来提示是还是不是已找到相称。

Regex r = new Regex("abc"); // 定义一个Regex对象实例
Match m = r.Match("123abc456"); // 在字符串中匹配
if (m.Success)
{
 Console.WriteLine("Found match at position " m.Index); //输入匹配字符的位置
}

  大多数最首要的正则表明式语言运算符都以非转义的单个字符。转义符 (单个反斜杠)通告正则表明式深入分析器反斜杠后边的字符不是运算符。举例,深入分析器将星号 (*) 视为重复限定符,而将后跟星号的反斜杠 (*) 视为 Unicode 字符 002A。

Regex r = new Regex("abc"); // 定义一个Regex对象实例
Match m = r.Match("123abc456"); // 在字符串中匹配
if (m.Success)
{
 Console.WriteLine("Found match at position " m.Index); //输入匹配字符的位置
}

  3.三 MatchCollection 类表示非重叠相配的行列

  使用相似表明式要习贯的一点是,查看像这么怪诞的字符类别,但这么些行列的行事是极度逻辑化的。转义系列S表示别的不适空白的字符。*名为数量词,其意思是近日的字符能够再度大玖遍,包罗0次。系列S*表示其他不适空白的字符。因而,下面的格局相配于以n开头,以ion结尾的其余单个字。下表中列出的字符转义在正则表明式和替换格局中都会被辨认。

  三.三 MatchCollection 类表示非重叠相配的行列

  该集合为只读的,并且未有国有构造函数。MatchCollection 的实例是由 Regex.Matches 属性重回的。使用 Regex 类的 Matches 方法,通过在输入字符串中找到的保有相配填充 MatchCollection。上边代码示例演示了怎么将集中复制到一个字符串数组(保留每1相配)和1个整数数组(提醒每1匹配的职位)中。

  表一:特定字符或转义系列

  该集合为只读的,并且未有国有构造函数。MatchCollection 的实例是由 Regex.Matches 属性再次回到的。使用 Regex 类的 Matches 方法,通过在输入字符串中找到的享有相配填充 MatchCollection。上面代码示例演示了何等将集纳复制到一个字符串数组(保留每1相配)和1个整数数组(提醒每一相配的职分)中。

MatchCollection mc;
String[] results = new String[20];
int[] matchposition = new int[20];
Regex r = new Regex("abc"); //定义一个Regex对象实例
mc = r.Matches("123abc4abcd");
for (int i = 0; i < mc.Count; i ) //在输入字符串中找到所有匹配
{
 results[i] = mc[i].Value; //将匹配的字符串添在字符串数组中
 matchposition[i] = mc[i].Index; //记录匹配字符的位置
}
特定字符或转义序列 含义 样例 匹配的样例
^ 输入文本的开头 ^B B,但只能是文本中的第一个字符
$ 输入文本的结尾 X$ X,但只能是文本中的最后一个字符
. 除了换行字符(n)以外的所有单个字符 i.ation isation、ization
* 可以重复0次或多次的前导字符 ra*t rat、raat等
可以重复1次或多次的前导字符 ra t rt、rat、raat等
可以重复0次或1次的前导字符 ra?t 只有rt和rat匹配
s 任何空白字符 sa [space]a,ta,na(t和n与C#的t和n含义相同)
S 任何不是空白的字符 SF aF,rF,cF,但不能是tf
b 字边界 ionb 以ion结尾的任何字
B 不是字边界的位置 BXB 字中间的任何X
MatchCollection mc;
String[] results = new String[20];
int[] matchposition = new int[20];
Regex r = new Regex("abc"); //定义一个Regex对象实例
mc = r.Matches("123abc4abcd");
for (int i = 0; i < mc.Count; i ) //在输入字符串中找到所有匹配
{
 results[i] = mc[i].Value; //将匹配的字符串添在字符串数组中
 matchposition[i] = mc[i].Index; //记录匹配字符的位置
}

  3.四 GroupCollection 类表示捕获的组的联谊

  假诺要物色一个元字符,也足以透过带有反斜杠的转义字符来代表。比如,.表示除了换行字符以外的别的字符,而.表示3个点。
能够把可替换的字符放在方括号中,请求相称包蕴那个字符。例如,[1|c]表示字符能够是壹依旧是c。倘若要搜索map或许man,能够应用连串"ma[n|p]"(仅指点号内字符,下边雷同)。在方括号中,也足以制定2个限制,举例"[a-z]"表示全部的小写字母(使用连字号 (-) 允许内定接二连三字符范围),"[B-F]"表示B到F之间的具备大写字母,"[0-9]"表示三个数字,纵然要探究四个整数(该连串只包涵0到玖的字符),就足以编写制定"[0-9] "(注意,使用 字符表示至少要有这么1个数字,但能够有四个数字,所以⑨、八叁和34肆三等都是卓绝的。)
上边看看一般表达式的结果,编写一个实例RegularExpressionsZzy。创建多少个一般说明式,展现其结果,让用户明白一下表达式是如何专门的学业的。

  叁.四 GroupCollection 类表示捕获的组的成团

  该集合为只读的,并且未有国有构造函数。GroupCollection 的实例在 Match.Groups 属性回来的集聚中回到。下边包车型地铁调整台应用程序查找并出口由正则表明式捕获的组的多少。

本文由韦德国际1946发布于韦德国际1946国际网址,转载请注明出处:中使用正则表达式完结字符串的查找,查找字符

关键词: 韦德体育1946

上一篇:表头固定,表头固定在最上部
下一篇:没有了