亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

C#中利用正則表達式實現字符串搜索

系統 1980 0

C#中利用正則表達式實現字符串搜索

作者 來源
閱讀 354 人次,2006-4-27 9:52:00

摘要 :本文給出了在C#下利用正則表達式實現字符串搜索功能的方法,通過對.NET框架下的正則表達式的研究及實例分析,總結了正則表達式的元字符、規則、選項等。

關鍵字 :正則表達式、元字符、字符串、匹配

1、正則表達式簡介

  正則表達式提供了功能強大、靈活而又高效的方法來處理文本。正則表達式的全面模式匹配表示法可以快速地分析大量的文本以找到特定的字符模式;提取、編輯、替換或刪除文本子字符串;或將提取的字符串添加到集合以生成報告。對于處理字符串(例如 HTML 處理、日志文件分析和 HTTP 標頭分析)的許多應用程序而言,正則表達式是不可缺少的工具。

  .NET 框架正則表達式并入了其他正則表達式實現的最常見功能,被設計為與 Perl 5 正則表達式兼容,.NET 框架正則表達式還包括一些在其他實現中尚未提供的功能,.NET 框架正則表達式類是基類庫的一部分,并且可以和面向公共語言運行庫的任何語言或工具一起使用。

2、字符串搜索

  正則表達式語言由兩種基本字符類型組成:原義(正常)文本字符和元字符。正是元字符組為正則表達式提供了處理能力。當前,所有的文本編輯器都有一些搜索功能,通常可以打開一個對話框,在其中的一個文本框中鍵入要定位的字符串,如果還要同時進行替換操作,可以鍵入一個替換字符串,比如在Windows操作系統中的記事本、Office系列中的文檔編輯器都有這種功能。這種搜索最簡單的方式,這類問題很容易用String類的String.Replace()方法來解決,但如果需要在文檔中識別某個重復的,該怎么辦?編寫一個例程,從一個String類中選擇重復的字是比較復雜的,此時使用語言就很適合。

  一般表達式語言是一種可以編寫搜索表達式的語言。在該語言中,可以把文檔中要搜索的文本、轉義序列和特定含義的其他字符組合在一起,例如序列\b表示一個字的開頭和結尾(子的邊界),如果要表示正在查找的以字符th開頭的字,就可以編寫一般表達式\bth(即序列字符界是-t-h)。如果要搜索所有以th結尾的字,就可以編寫th\b(序列t-h-字邊界)。但是,一般表達式要比這復雜得多,例如,可以在搜索操作中找到存儲部分文本的工具性程序(facility)。

3、.NET 框架的正則表達式類

  下面通過介紹 .NET 框架的正則表達式類,熟悉一下.NET框架下的正則表達式的使用方法。

  3.1 Regex 類表示只讀正則表達式

  Regex 類包含各種靜態方法,允許在不顯式實例化其他類的對象的情況下使用其他正則表達式類。以下代碼示例創建了 Regex 類的實例并在初始化對象時定義一個簡單的正則表達式。請注意,使用了附加的反斜杠作為轉義字符,它將 \s 匹配字符類中的反斜杠指定為原義字符。

Regex r; // 聲明一個 Regex類的變量
r = new Regex("\\s2000"); // 定義表達式

  3.2 Match 類表示正則表達式匹配操作的結果

  以下示例使用 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); //輸入匹配字符的位置
}

  3.3 MatchCollection 類表示非重疊匹配的序列

  該集合為只讀的,并且沒有公共構造函數。MatchCollection 的實例是由 Regex.Matches 屬性返回的。使用 Regex 類的 Matches 方法,通過在輸入字符串中找到的所有匹配填充 MatchCollection。下面代碼示例演示了如何將集合復制到一個字符串數組(保留每一匹配)和一個整數數組(指示每一匹配的位置)中。

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.4 GroupCollection 類表示捕獲的組的集合

  該集合為只讀的,并且沒有公共構造函數。GroupCollection 的實例在 Match.Groups 屬性返回的集合中返回。下面的控制臺應用程序查找并輸出由正則表達式捕獲的組的數目。

using System;
using System.Text.RegularExpressions;
public class RegexTest
{
 public static void RunTest()
 {
  Regex r = new Regex("(a(b))c"); //定義組
  Match m = r.Match("abdabc");
  Console.WriteLine("Number of groups found = " + m.Groups.Count);
 }
 public static void Main()
 {
  RunTest();
 }
}

  該示例產生下面的輸出:

Number of groups found = 3

  3.5 CaptureCollection 類表示捕獲的子字符串的序列

  由于限定符,捕獲組可以在單個匹配中捕獲多個字符串。Captures屬性(CaptureCollection 類的對象)是作為 Match 和 group 類的成員提供的,以便于對捕獲的子字符串的集合的訪問。例如,如果使用正則表達式 ((a(b))c)+(其中 + 限定符指定一個或多個匹配)從字符串"abcabcabc"中捕獲匹配,則子字符串的每一匹配的 Group 的 CaptureCollection 將包含三個成員。

  下面的程序使用正則表達式 (Abc)+來查找字符串"XYZAbcAbcAbcXYZAbcAb"中的一個或多個匹配,闡釋了使用 Captures 屬性來返回多組捕獲的子字符串。

using System;
using System.Text.RegularExpressions;
public class RegexTest
{
 public static void RunTest()
 {
  int counter;
  Match m;
  CaptureCollection cc;
  GroupCollection gc;
  Regex r = new Regex("(Abc)+"); //查找"Abc"
  m = r.Match("XYZAbcAbcAbcXYZAbcAb"); //設定要查找的字符串
  gc = m.Groups;
  //輸出查找組的數目
  Console.WriteLine("Captured groups = " + gc.Count.ToString());
  // Loop through each group.
  for (int i=0; i < gc.Count; i++) //查找每一個組
  {
   cc = gc[i].Captures;
   counter = cc.Count;
   Console.WriteLine("Captures count = " + counter.ToString());
   for (int ii = 0; ii < counter; ii++)
   {
    // Print capture and position.
    Console.WriteLine(cc[ii] + " Starts at character " +
    cc[ii].Index); //輸入捕獲位置
   }
  }
 }
 public static void Main() {
  RunTest();
 }
}

  此例返回下面的輸出結果:

Captured groups = 2
Captures count = 1
AbcAbcAbc Starts at character 3
Captures count = 3
Abc Starts at character 3
Abc Starts at character 6
Abc Starts at character 9

  3.6 Capture 類包含來自單個子表達式捕獲的結果

  在 Group 集合中循環,從 Group 的每一成員中提取 Capture 集合,并且將變量 posn 和 length 分別分配給找到每一字符串的初始字符串中的字符位置,以及每一字符串的長度。

Regex r;
Match m;
CaptureCollection cc;
int posn, length;
r = new Regex("(abc)*");
m = r.Match("bcabcabc");
for (int i=0; m.Groups[i].Value != ""; i++)
{
 cc = m.Groups[i].Captures;
 for (int j = 0; j < cc.Count; j++)
 {
  posn = cc[j].Index; //捕獲對象位置
  length = cc[j].Length; //捕獲對象長度
 }
}


圖1:對象關系

  把組合字符組合起來后,每次都會返回一個組對象,就可能并不是我們希望的結果。如果希望把組合字符作為搜索模式的一部分,就會有相當大的系統開銷。對于單個的組,可以用以字符序列"?:"開頭的組禁止這么做,就像URI樣例那樣。而對于所有的組,可以在RegEx.Matches()方法上指定RegExOptions.ExplicitCapture標志。

C#中利用正則表達式實現字符串搜索


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 激情综合在线观看 | 国产欧美日韩一区二区三区视频 | 四虎影视在线影院在线观看 | 噜噜狠狠| 亚洲国产高清美女在线观看 | 国产精品久久久久久久久 | 欧美一级毛片高清免费观看 | 免看一级a毛片一片成人不卡 | 91成人在线播放 | 成人午夜天 | 久久99精品视香蕉蕉 | 欧美国产日韩在线 | 国内精品伊人久久久久妇 | 九九热线有精品视频99 | 性欧美4k高清精品 | 欧美性色黄大片一级毛片视频 | 久草在在线 | 99久久精品久久久久久婷婷 | 精品乱久久 | 日韩www | 依人九九| 黄色毛片免费观看 | 日日干夜夜爱 | 久久草在线视频国产一 | 久久精品国产免费看久久精品 | 激情久久免费视频 | 国产精品嫩草影院99av视频 | 国产成人免费片在线观看 | 亚洲日本中文 | 国产精品天天操 | 欧美一级毛片视频 | 国产系列在线观看 | 一级毛片在线播放 | 欧美一区二区视频 | 亚洲国产欧美自拍 | 九月丁香婷婷亚洲综合色 | 国产成人精品高清在线 | 久久久精品久久久久久 | 四虎精品视频 | 奇米网狠狠干 | 亚洲国产欧美在线 |