ASP.NET-細節(jié)-正則表達式過濾字符串

起因:

在開發(fā)過程中,需要對字符串進行替換過濾,首先考慮到的是replace函數(shù),這個函數(shù)是比較通用的替換函數(shù),str.Trim().Replace("某字符串", "")即可全部替換字符串,但是在這次的特殊情況下,是需要替換特殊情景的字符串,就想到了正則表達式

正則表達式:

又名 “規(guī)則表達式”,由我們自己來書寫 “規(guī)則”,專門用來檢測字符串是否符合 “規(guī)則” 使用的,我們使用一些特殊的字符或者符號定義一個 “規(guī)則公式”,然后用我們定義好的 “規(guī)則公式” 去檢測字符串

簡單的示例:
var reg = /\d+/ // \d是檢測數(shù)字  +是表示任意多個
var str1 = '123456'
var str2 = 'abcdef'
console.log(reg.test(str1)) // 返回true
console.log(reg.test(str2)) // 返回false
首先是正則表達式中最基礎的元字符

.: 匹配非換行的任意字符
\s : 匹配空白字符(空格/制表符/...)
\S : 匹配非空白字符
\d: 匹配數(shù)字
\D : 匹配非數(shù)字
\w : 匹配數(shù)字字母下劃線
\W : 匹配非數(shù)字字母下劃線
* : 匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價于{0,}
x|y : 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"
+ : 匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價于 {1,}。
^: 匹配輸入字符串的開始位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之后的位置
$: 匹配輸入字符串的結(jié)束位置。如果設置了RegExp 對象的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置

[abc] : 字符集合。匹配所包含的任意一個字符。例如, '[abc]' 可以匹配 "plain" 中的 'a',加入^可以表示非集合,如[^abc]表示不是abc

\: 將下一個字符標記為一個特殊字符、或一個原義字符、或一個 向后引用、或一個八進制轉(zhuǎn)義符。例如,'n' 匹配字符 "n"。'\n' 匹配一個換行符。序列 '\' 匹配 "" 而 "(" 則匹配 "("

? : 匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等價于 {0,1}。當該字符緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配所有 'o'。

{n,m} : m 和 n 均為非負整數(shù),其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價于 'o?'。注意在逗號和兩個數(shù)之間不能有空格,且m可以為空,意為無窮大

(pattern) : 匹配 pattern 并獲取這一匹配。所獲取的匹配可以從產(chǎn)生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中則使用 0…9 屬性。要匹配圓括號字符,請使用 '(' 或 ')'。

(?:pattern) : 正向肯定預查(look ahead positive assert),在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。預查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始

(?!pattern) : 正向否定預查(negative assert),在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。預查不消耗字符,也就是說,在一個匹配發(fā)生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始

正則表達式 - 運算符優(yōu)先級
運算符 描述
\ 轉(zhuǎn)義符
(), (?:), (?=), [] 圓括號和方括號
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位點和序列(即:位置和順序)
| 替換,"或"操作字符具有高于替換運算符的優(yōu)先級,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",請使用括號創(chuàng)建子表達式,從而產(chǎn)生"(m|f)ood"

實例:

回到正題我是為了匹配替換一個字符串使用了正則表達式,一般的替換只是用通用的replace即可:

If str.Trim.Contains("""") Then 
    message.To.Add(New MailAddress(str.Trim().Replace("""", "")))
Else
    message.To.Add(New MailAddress(str.Trim()))
End If

但是如果是只替換某些特殊情況下的字符,如下面我需要替換名稱中間的英文逗號為英文句號
“Tom, Striy”<11123@163.com>,”Ben, Rop”<11123@163.com>,”Rick, City”<11123@163.com>
則可以按照(英文雙引號)(任意長度中英文字符串)(英文逗號)(空格)(任意長度中英文字符串)(英文雙引號)
這個規(guī)則來對字符串中名稱中間的逗號進行匹配
寫出正則表達式為 (\u0022)([a-zA-Z\u4e00-\u9fa5]+),(\s[a-zA-Z\u4e00-\u9fa5]+)(\u0022),放入代碼中使用則如下:

If Regex.Matches(str.Trim(), "(\u0022)([a-zA-Z\u4e00-\u9fa5]+),(\s[a-zA-Z\u4e00-\u9fa5]+)(\u0022)").Count > 0 Then
    str = Regex.Replace(str.Trim(), "(\u0022)([a-zA-Z\u4e00-\u9fa5]+),(\s[a-zA-Z\u4e00-\u9fa5]+)(\u0022)", "$1$2.$3$4")
End If

正則表達式測試工具

這里我推薦在寫正則表達式的適合使用一下測試工具進行測試,能夠減少出錯的可能性,如下圖我就可以對我寫的正則表達式進行測試:


正則表達式測試工具http://tool.chinaz.com/regex

附錄:

常用的正則表達式

PS:此處的校驗數(shù)字的表達式和校驗字符的表達式總結(jié)參考自CSDN博主「ZhaoYingChao88」的原創(chuàng)文章

一、校驗數(shù)字的表達式

1. 數(shù)字:^[0-9]*$

2. n位的數(shù)字:^\d{n}$

3. 至少n位的數(shù)字:^\d{n,}$

4. m-n位的數(shù)字:^\d{m,n}$

5. 零和非零開頭的數(shù)字:^(0|[1-9][0-9]*)$

6. 非零開頭的最多帶兩位小數(shù)的數(shù)字:^([1-9][0-9]*)+(.[0-9]{1,2})?$

7. 帶1-2位小數(shù)的正數(shù)或負數(shù):^(\-)?\d+(\.\d{1,2})?$

8. 正數(shù)、負數(shù)、和小數(shù):^(\-|\+)?\d+(\.\d+)?$

9. 有兩位小數(shù)的正實數(shù):^[0-9]+(.[0-9]{2})?$

10. 有1~3位小數(shù)的正實數(shù):^[0-9]+(.[0-9]{1,3})?$

11. 非零的正整數(shù):^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$

12. 非零的負整數(shù):^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$

13. 非負整數(shù):^\d+$ 或 ^[1-9]\d*|0$

14. 非正整數(shù):^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$

15. 非負浮點數(shù):^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

16. 非正浮點數(shù):^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

17. 正浮點數(shù):^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

18. 負浮點數(shù):^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$

19. 浮點數(shù):^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

二、校驗字符的表達式

1. 漢字:^[\u4e00-\u9fa5]{0,}$

2. 英文和數(shù)字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$

3. 長度為3-20的所有字符:^.{3,20}$

4. 由26個英文字母組成的字符串:^[A-Za-z]+$

5. 由26個大寫英文字母組成的字符串:^[A-Z]+$

6. 由26個小寫英文字母組成的字符串:^[a-z]+$

7. 由數(shù)字和26個英文字母組成的字符串:^[A-Za-z0-9]+$

8. 由數(shù)字、26個英文字母或者下劃線組成的字符串:^\w+$ 或 ^\w{3,20}$

9. 中文、英文、數(shù)字包括下劃線:^[\u4E00-\u9FA5A-Za-z0-9_]+$

10. 中文、英文、數(shù)字但不包括下劃線等符號:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$

11. 可以輸入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+ 12 禁止輸入含有~的字符:[^~\x22]+

其它:

.*匹配除 \n 以外的任何字符。

/[\u4E00-\u9FA5]/ 漢字

/[\uFF00-\uFFFF]/ 全角符號

/[\u0000-\u00FF]/ 半角符號
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 概述 正則表達式是一種描述字符串結(jié)果的語法規(guī)則,是一個特定的格式化模式,可以匹配、替換、截取匹配的字符串。常用的語...
    醉于麥田閱讀 559評論 0 0
  • ES6學習筆記-字符串與正則表達式 JS字符串編碼 在ES6之前,JS的字符串以16位字符編碼(UCS-2)為基礎...
    小線亮亮閱讀 705評論 0 0
  • 搞懂Python 正則表達式用法 Python 正則表達式 正則表達式是一個特殊的字符序列,它能幫助你方便的檢查一...
    廈熱閱讀 1,805評論 0 2
  • 前言 對于正則,著稱火星文字,見名知意主要它晦澀難懂,一直以來,看到它總是怕怕的,在平時,也只是簡單的用用,其主要...
    itclanCoder閱讀 919評論 0 2
  • http://www.samsung.com/global/galaxy/gear-vr/
    船長醬閱讀 234評論 0 0

友情鏈接更多精彩內(nèi)容