程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> C# 2.0 之 正則表達式

C# 2.0 之 正則表達式

編輯:.NET實例教程
很多程序中都回牽涉到字符串的相關操作,當功能需求比較復雜的時候,僅僅依靠string類提供的一些操作就很弱了。.Net Framework中提供了正則表達式類,專門用於解決復雜字符串的匹配問題。這在1.1版本中就有了,在後續版本的Framework中幾乎沒有變化。

    string類提供了一些字符串匹配的方法,比如:

  • String.IndexOf
  • String.IndexOfAny
  • String.LastIndex
  • String.LastIndexOfAny

    下面是一個實例,演示了這四個方法的應用

using System;

using System.Collections.Generic;

using System.Text;

 

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            string testString = "Nocturne Studio!";

            int position = 0;

 

            position = testString.IndexOf('o');

            Console.WriteLine("Character o is at the position {0} as forward", position);

 

            position = testString.LastIndexOf('o');

            Console.WriteLine("Character o is at the position {0} as backward", position);

 

            char[] chars = new char[2] { 'c', 't' };

 

            position = testString.IndexOfAny(chars);

            Console.WriteLine("Character c or t is at the position {0} as forward", position);

 

            position = testString.LastIndexOfAny(chars);

            Console.WriteLine("Character c or t is at the position {0} as backward", position);

        }

 

    }

}

    運行的結果為:

 

Character o is at the position 1 as forward
Character o is at the position 14 as backward
Character c or t is at the position 2 as forward
Character c or t is at the position 10 as backward

這裡的位置和數組索引一樣,是從0開始的。實際上的匹配問題要比這個復雜得多,比如要尋找所有以N開頭,以e結尾的單詞,傳統的解決辦法非常復雜,代碼量令人難以接受。這個時候,正則表達式就成為最好的選擇。

    正則表達式提供了強大、靈活而且高效的方法來處理文本,其全面模式匹配表示法使得快速分析大量文本以找到特定的字符模式成為可能。.Net Framework正則表達式還包括一些其他工具(比如Perl語言、awk工具包)沒有提供的功能,比如從右到左匹配和即時編譯。

    在DOS命令行中,有著*和?兩種通配符(在SQL語句中也有類似的情況),其功能大家都很熟悉了。C#中的正則表達式就類似於這樣一組元素,通過對這些元素的使用,可以創造出任何模式的正則表達式來。

語言元素

字符轉義

    大多數重要的正則表達式語言運算符都是非轉義的單個字符。轉義符“\”通知分析器後面的字符不是運算符。比如,*會被視為重復限定符,而\*則被理解為真正的星號。

  • 一般字符:除了 . $ ^ { [ ( | ) * + ? \ 外,其它字符就代表自己原來的意思
  • \a:與響鈴 \u0007 匹配
  • \b:與退格符 \u0008 匹配
  • \t:與制表符 \u0009 匹配
  • \r:與回車符 \u000D 匹配
  • \v:與垂直制表符 \u000B 匹配
  • \f:與換頁符 \u000C 匹配
  • \n:與換行符 \u000A 匹配
  • \e:與Esc符 \u001B 匹配

替換

    提供有關在替換模式中使用的特殊構造的信息。字符轉義和替換是在替換模式中識別的唯一的特殊構造。下面的語法構造只允許出現在正則表達式中,替換模式中不識別它們。比如 * 在替換模式中不會被當作元字符,而只是一個普通字符。替換模式中的 $ 在正則表達式中只是表示指定字符串結尾的意思。

  • $數字:替換按十進制組號number匹配的最後一個子字符串
  • ${name}:替換由(?<name>)組匹配的最後一個子字符串
  • $$:替換單個$字符
  • $&:替換完全匹配本身的一個副本
  • $`:替換匹配前的輸入字符串的所有副本
  • $':替換匹配後的輸入字符串的所有副本
  • $+:替換最後捕獲的組
  • $_:替換整個輸入字符串

字符類

    提供有關定義要匹配的子字符串的正則表達式字符集的信息

  • .:匹配除“\n”以外的任何字符。如果已用Singleline選項做過修改,則句點字符課與任何字符匹配
  • [abcde]:與指定字符集中包含的任何單個字符匹配,即與“a”、“b”、“c”、“d”、“e”中的任何一個匹配
  • [^zyxwv]:與不在指定字符集中的任何單個字符匹配,即與除了“z”、“y”、“x”、“w”、“v”之外的字符匹配
  • [0-9a-fA-F]:用減號-來指定連續字符范圍。這裡指的是從0到9、從a到f和從A到F中的任何一個匹配
  • \p{name}:與{name}指定的命名字符類中的任何字符匹配。支持的名稱為Unicode組和塊范圍,比如L1、Nd、Z、IsGreek、IsBoxDrawing
  • \P{name}:與在{name}中指定的組和塊范圍不包括的文字匹配
  • \w:與任何單詞字符匹配
  • \W:與任何非單詞字符匹配
  • \s:與任何空白字符匹配
  • \S:與任何非空白字符匹配
  • \d:與任何十進制數字匹配
  • \D:與任何非數字匹配

正則表達式選項

    可以使用影響匹配行為的選項修改正則表達式模式。

原子零寬度斷言

    提供有關零寬度斷言的信息,該斷言根據正則表達式分析器在輸入字符串的當前位置而使匹配成功或失敗。

限定符

    提供有關修改正則表達式的可選數量數據的信息。限定符將可選數量的數據添加到正則表達式。限定符表達式應用於緊挨著它前面的字符、組或字符類。

正則表達式類

    C#中提供了System.Text.RegularExpressions命名空間,提供了對.Net Framework正則表達式引擎的訪問。

  • Regex類:表示不可變正則表達式類
  • Match類:表示正則表達式匹配操作的結果
  • MatchCollection類:表示成功的非重疊匹配的序列
  • GroupCollection類:表示捕獲的組的集合並返回單個匹配中捕獲的組的集合
  • CaptureCollection類:表示捕獲的子字符串的序列,並且返回由單個捕獲組執行的捕獲的集合。
  • Group類:表示來自單個捕獲組的結果。
  • Capture類:包含來自單個子表達式捕獲的結果。

常用正則表達式

    下面是一些常用的正則表達式,在日常應用中很常見

  • 匹配中文字符:[\u4e00-\u9fa5]
  • 匹配雙字節字符(包括漢字):[^\x00-\xff]
  • 匹配空行:\n[\s|]*\r
  • 匹配Html標記:/<(.*)>.*<\/\1>|<(.*)\/>/
  • 匹配首尾空格:(^\s*)|(\s*$)
  • 匹配E-Mail地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
  • 匹配http網址的URL:http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?

using System;

using System.Collections.Generic;

using System.Text;

using System.Text.RegularExpressions;

 

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            Regex r = new Regex(@"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*");

 

            string emailString = "This is a string containing a Email address:\n\[email protected]\n\nNocturne Studio";

          string nonEmailString = "This is a string without any email addresses\n\nNocturne Studio";

 

            Match m = r.Match(emailString);

            if (m.Success)

            {

                Console.WriteLine("Success!\nPosition: {0}", m.Index);

            }

            else

            {

                Console.WriteLine("Failed!");

            }

 

            m = r.Match(nonEmailString);

            if (m.Success)

            {

                Console.WriteLine("Success!\nPosition: {0}", m.Index);

            }

            else

            {

                Console.WriteLine("Failed!");

            }

        }

 

    }

}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved