文章出處

Regular Expression

Net程序員必然要掌握正則的核心內容:匹配提取替換常用元字符

正則表達式是用來進行文本處理的技術,是語言無關的,在幾乎所有語言中都有實現。

 


 

常用元字符

.:代表除了換行之外的任意字符,一個字符占位。

 

*:代表前面的子表達式出現0次或者多次。如果需要*代表的子表達式是多個字符,就將多個字符用()包含。

 

+:代表前面的表達式出現1次或者多次。

 

?:代表前面的表達式出現0次或者出現1次。

 

{n}:代表前面的子表達式要出現n次。

 

^代表開始$代表結束

 

{n,m}:代表前面的子表達式最少出現n次,最多出現m次。

 

{n,}:說明前面的子表達式最少出現n次,最多沒有限制。

 

[]:輸入的內容必須是在括號內有的一個字符。

 

():改變優先級、分組。

 

\d:代表0-9的數字。

 

\D:代表非數字。

 

\w:代表0-9a-zA-Z_中文   (經過實例證明C#里\w包含中文,JavaScript里不包含中文

 

\W:代表其他特殊字符(除了0-9a-zA-Z_中文)

 

\s:代表看不到的字符,如:回車、空格、制表符。

 

\S:代表所有可見字符

 

項目實戰:

1.運用場合:不包含某些特定的字符情況下

((?![@:]).)+:代表不是@和:的字符。

 

2.匹配中文

[\u4E00-\u9FFF]

 

 

 

 


 

 

正則表達式進行匹配的原則:

1.(有沒有)只關注是否存在,而不關注它的位置,也就意味著只需要能夠匹配其中一個就可以 。

2.貪婪模式:如果找到了能匹配的字符,那么他還繼續往下匹配盡可能多的字符,只到最后

 


 

 

.net中的正則表達式

正則表達式在.net中就是用字符串來表示,這個字符串格式比較特殊,無論多么特殊,在C#語言看來都是普通的字符出,具體什么含義由Regex類內部進行語法分析。

常用的4種情況:

  1. 判斷是否匹配(是否有):Regex.IsMatch("字符串","正則表達式");
  2. 字符串提取:Regex.Match("字符串","要提取的字符出的正則表達式"); ——只能提取一個(提取一次)。
  3. 字符串提取(循環提取所有):Regex.Matches(),可以提取所有匹配的字符串。
  4. 字符串替換:Regex.Replace("字符串","正則","替換內容");

 

 

提取只有一個匹配項的字符串,進行分組,提取。

        string str = "tiantianjcx@qq.com";

                Match match = Regex.Match(str, @"^(\w+)[@](\w+)[.](\w+)$");

                if (match.Success) //匹配成功

                {

                    Console.WriteLine(match.Groups[0].Value);  //結果:tiantianjcx@qq.com

                    Console.WriteLine(match.Groups[1].Value);  //結果:tiantianjcx

                    Console.WriteLine(match.Groups[2].Value);  //結果:qq

                    Console.WriteLine(match.Groups[3].Value);  //結果:com

                }

 


 

 

JavaScript正則表達式

創建:

字面值:var regex=/元字符/;

構造函數:var regex=new RegExp("元字符");

 

匹配:

bool 正則表達式對象.test("字符串");

   var regex = /\d*/;

    alert(regex.test("122"));   //true

 

提取:

像數組的對象 正則表達式對象.exec("字符串");

這個對象的[0]是匹配到的結果,[1],[2]....是各個組

1.單個提取

 

2.單個提取并分組

var str = "我的郵箱是tiantianjcx@qq.com";

    var regex = /(\w+)@(\w+[.]\w{2,3})/;

 

    var arr= regex.exec(str);

    alert(arr.length);

    for (var i = 0; i < arr.length; i++) {

        alert(arr[i]);

    }

 

3.循環提取

  var str = "我的郵箱是tiantianjcx@qq.com,你的是sukun@163.com號吧";

        var regex = /\w+@\w+[.]\w{2,3}/g;

 

        var arr = [];

        var item = null;

        while ((item = regex.exec(str)) != null) {

            arr.push(item);

        }

 

注意:創建正則表達式對象里的字符必須加上g(全局匹配),否則會陷入是循環

 

4.替換

javascript的正則替換,是使用String的Replace()方法將正則表達式作為參數處理。

var str = "a--b---------c---------------d---------------e---------------f";

        str = str.replace(/-+/g,"-");

 

  var str = "2016年7月26日";

        str = str.replace(/(\d+)年(\d+)月(\d+)日/,"$1-$2-$3");

 


 

 

自測題:

 1     /*
 2              192.168.10.5[port=21,type=ftp]”,這個字符串表示IP地址為192.168.10.5的服務器的21端口提供的是ftp服務,
 3              * 其中如果“,type=ftp”部分被省略,則默認為http服務。請用程序解析此字符串,然后打印出“IP地址為***的服務器的***端口提供的服務為***”
 4              */
 5 
 6 
 7             string str = "192.168.10.5[port=21,type=ftp]";
 8             Match match = Regex.Match(str, @"^(\d{1,3}[.]?\d{1,3}[.]?\d{1,3}[.]?\d{1,3}[.]?)[[]\w+=(\w+),?\w*=?(\w*)[]]$");
 9             if (match.Success) //匹配成功
10             {
11                 Console.WriteLine("IP地址為:{0}", match.Groups[1].Value);
12                 Console.WriteLine("端口::{0}", match.Groups[2].Value);
13                 if (string.IsNullOrEmpty(match.Groups[3].Value))
14                 {
15                     Console.WriteLine("端口提供的服務為:http");
16                 }
17                 else
18                 {
19                     Console.WriteLine("端口提供的服務為:{0}", match.Groups[3].Value);
20                 }
21             }
View Code

 

 1             /*
 2              讀取網站的內容,用正則表達式匹配郵箱,并提取
 3              * 注意:做循環匹配不能加"^"和$(開始和結束),否則就只能匹配一項
 4              */
 5             string path = @"E:\視頻大全\傳智播客.NET2014.3.26-07.09期\6--2014-4-03 文件操作和正則表達式\資料\正則表達式-素材\正則表達式\大家留下email交友吧_email_天涯社區.htm";
 6 
 7             string txt = File.ReadAllText(path);
 8 
 9             MatchCollection arr = Regex.Matches(txt, @"[a-zA-Z0-9]+[@][a-zA-Z0-9]+[.]+[a-zA-Z]{2,3}");
10 
11             using (Stream fs = new FileStream("E:\\mail.txt", FileMode.Create))
12             using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
13             {
14 
15                 for (int i = 0; i < arr.Count; i++)
16                 {
17                     Match match = arr[i];
18                     sw.WriteLine(match.Groups[0].Value);
19 
20                 }
21             }
View Code

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()