網站首頁 編程語言 正文
一、正則表達式應用舉例
1、C#校驗合法性:
if (!Regex.IsMatch(this.txtCode.Text.Trim(), @"^[0-9]*$", RegexOptions.Singleline)) Console.Write("只能輸入數字");
2、C#限制輸入
輸入除了數字之外的所有非法字符的判斷
private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { //退格鍵(8)、 回車(13)、全選(1)、復制(3)、粘貼(22) e.Handled = !(Regex.IsMatch(e.KeyChar, @"\d", RegexOptions.Singleline) || e.KeyChar == (char)8 || e.KeyChar != (char)13); }
粘貼時過濾不是數字的字符
private void textbox1_TextChanged(object sender, EventArgs e) { var reg = new Regex("^[0-9]*$"); var str = textbox1.Text.Trim(); var sb = new StringBuilder(); if (!reg.IsMatch(str)) { for (int i = 0; i < str.Length; i++) { if (reg.IsMatch(str[i].ToString())) { sb.Append(str[i].ToString()); } } textbox1.Text = sb.ToString(); //定義輸入焦點在最后一個字符 textbox1.SelectionStart = textbox1.Text.Length; } }
3、正則表達式匹配閉合HTML標簽(支持嵌套)
1、分組構造
分組構造描述了正則表達式的子表達式,通常用于捕獲輸入字符串的子字符串。 分組構造包括下表中列出的語言元素。 有關詳細信息,請參閱?分組構造。
分組構造 | 描述 | 模式 | 匹配 |
---|---|---|---|
(?subexpression?) | 捕獲匹配的子表達式并將其分配到一個從 1 開始的序號中。 | (\w)\1 | "deep"?中的?"ee" |
(?<?name?>subexpression????????) | 將匹配的子表達式捕獲到一個命名組中。 | (?<double>\w)\k<double> | "deep"?中的?"ee" |
(?<?name1?-name2?>subexpression?) | 定義平衡組定義。 有關詳細信息,請參閱?分組構造中的"平衡組定義"部分。 | (((?'Open'\()[^\(\)]*)+((?'Close-Open'\))[^\(\)]*)+)*(?(Open)(?!))$ | "3+2^((1-3)*(3-1))"?中的?"((1-3)*(3-1))" |
(?:subexpression?) | 定義非捕獲組。 | Write(?:Line)? | "Console.WriteLine()"?中的?"WriteLine"?"Console.Write(value)"?中的?"Write" |
(?imnsx-imnsx:subexpression?) | 應用或禁用?子表達式中指定的選項。 有關詳細信息,請參閱?正則表達式選項。 | A\d{2}(?i:\w+)\b | "A12xl A12XL a12xl"?中的?"A12xl"?和?"A12XL" |
(?=subexpression?) | 零寬度正預測先行斷言。 | \w+(?=\.) | "He is. The dog ran. The sun is out."中的?"is"、"ran"?和?"out" |
(?!subexpression?) | 零寬度負預測先行斷言。 | \b(?!un)\w+\b | "unsure sure unity used"?中的?"sure"和?"used" |
(?<=subexpression?) | 零寬度正回顧后發斷言。 | (?<=19)\d{2}\b | "1851 1999 1950 1905 2003"?中的?"99"、"50"?和?"05" |
(?<!subexpression?) | 零寬度負回顧后發斷言。 | (?<!19)\d{2}\b | "1851 1999 1950 1905 2003"?中的?"51"和?"03" |
(?>subexpression?) | 原子組。 | [13579](?>A+B+) | "1ABB 3ABBC 5AB 5AC"?中的?"1ABB"、"3ABB"?和?"5AB" |
2、舉例:
1、匹配帶有Class的div標簽:
<(?i)div[^>]*(?i)class=["']?.+["']?[\s\S]*>[^<>]*(((?'Open'<(?i)div[^>]*>)[^<>]*)+((?'-Open'</(?i)div>)[^<>]*)+)*(?(Open)(?!))</(?i)div>
文本:
<div class="codeHeader" id="code-try-5" data-bi-name="code-header"><span class="language">CSHTML</span><button type="button" class="action is-relative" data-bi-name="copy" aria-label="復制代碼"></button> <span class="icon"> <span class="docon docon-edit-copy" role="presentation"></span> </span> <span>復制</span> <div class="successful-copy-alert is-absolute has-right-zero has-top-zero has-left-zero has-bottom-zero is-flex has-flex-align-items-center has-flex-justify-content-center has-text-success-invert has-background-success is-transparent" aria-hidden="true"> <span class="icon is-size-4"> <span class="docon docon-check-mark" role="presentation"></span> </span> </div> </div>
2、匹配class以successful開頭的的div
<(?i)div[^>]*(?i)class=["']?successful.+["']?[\s\S]*>[^<>]*(((?'Open'<(?i)div[^>]*>)[^<>]*)+((?'-Open'</(?i)div>)[^<>]*)+)*(?(Open)(?!))</(?i)div>
3、匹配所有span標簽
<(?i)span[^>]*>[^<>]*(((?'Open'<(?i)span[^>]*>)[^<>]*)+((?'-Open'</(?i)span>)[^<>]*)+)*(?(Open)(?!))</(?i)span>
二、.Net正則表達式測試器
網頁版本工具:http://tools.jb51.net/regex
下載版:https://www.jb51.net/softs/61022.html
1、功能簡介
- 自動加載上次關閉前運行的最后一組數據
- 支持樹形,表格, 文本等三種結果查看方式
- 支持快捷鍵操作(F5運行, F4切換查詢替換模式, F6切換結果顯示方式, F2復制代碼, Ctrl+Tab切換焦點)
- 選中樹結點或單元格時自動選中源文本中對應的部分
- 表格內容可自由選擇, 自由復制
- 表格內容可導出為csv/xlsx文件
- 支持拖入文件作為匹配源文本
- 支持忽略大小寫,單行模式,多行模式,忽略空白,顯式匹配, ECMAScript等各種選項
- 可解析類似
new Regex("abc", RegexOptions.Singleline | RegexOptions.Multiline)
格式的C#代碼 - 支持生成并拷貝C#代碼到系統剪切板
2、下載與安裝
你可以使用以下兩種方式中的任意一個來下載安裝正則表達式測試器.
安裝版:?下載?Regester安裝程序,解壓后運行 RegesterSetup.zh.exe
綠色版:?下載?Regester,解壓后運行 Regester.exe,如果無法啟動,請自行下載安裝?Microsoft .Net Framework 4.5?后再試
3、界面截圖
三、.NET正則表達式Regex
在C#中,要使用正則表達式類,請在源文件開頭處添加以下語句:
using System.Text.RegularExpressions;
可參考微軟文檔 :.NET 正則表達式
1、IsMatch(Input,patter[,options]) 否則匹配
如果表達式在字符串中匹配,返回布爾值。
if (Regex.IsMatch("a.b.c.d", @"(\w)\.(\w)", RegexOptions.IgnoreCase)) Console.Write("匹配成功");
1、正則表達式選項:RegexOptions
有如下選項
RegexOptions枚舉值 |
內聯標志 |
簡單說明 |
ExplicitCapture |
n |
只有定義了命名或編號的組才捕獲 |
IgnoreCase |
i |
不區分大小寫 |
IgnorePatternWhitespace |
x |
消除模式中的非轉義空白并啟用由?# 標記的注釋。 |
MultiLine |
m |
多行模式,其原理是修改了^和$的含義 |
SingleLine |
s |
單行模式,和MultiLine相對應 |
2、內聯標志
相對于用RegexOptions在new Regex時定義Regex表達式的全局選項來說,內聯標志可以更小粒度(以組為單位)的定義匹配選項,從而更方便表達我們的思想。
\bA(?i)b\w+\b 匹配“ABA Able Act”中的“ABA”和“Able”
2、Match(Input,patter[,options]) 單個匹配
如果在輸入字符串中發現匹配,則返回匹配對象。(返回單個匹配對象)
Match m = Regex.Match("a.b.c.d", @"(\w)\.(\w)"); if (m.Success) Console.Write("Match=" + m.Value + " pos:" + m.Index); //Match=a.b pos:0
3、Matches(Input,patter[,options]) 多個匹配
如果在輸入字符串中發現全部匹配,則返回匹配集合對象。(返回多個匹配對象)
注意:匹配是不能重疊的,如果有重疊,在默認情況下,就選擇最長的匹配(除非元字符后加問號)。
Regex的Match()或Matches()=>Match匹配(MatchCollection)=>Group 組(GroupCollection子模式)=>Capture捕獲(CaptureCollection)
MatchCollection mc = Regex.Matches("a.b.c.d", @"(\w)\.(\w)"); for (int i = 0; i < mc.Count; i++) { Match match = mc[i]; Console.WriteLine("Match=" + match.Value + " :" + i); for (int j = 0; j < match.Groups.Count; j++) { Group group = match.Groups[j]; Console.WriteLine("--Group =" + group.Value + " :" + j); for (int k = 0; k < group.Captures.Count; k++) { Console.WriteLine("------Captures =" + group.Captures[k].Value + " :" + k); } } }
結果如下:
Match=a.b :0?
----Group =a.b :0?
--------Captures =a.b :0?
----Group =a :1?
--------Captures =a :0?
----Group =b :2?
--------Captures =b :0?
Match=c.d :1?
----Group =c.d :0?
--------Captures =c.d :0?
----Group =c :1?
--------Captures =c :0?
----Group =d :2?
--------Captures =d :0
返回匹配成功后的第一個子模式的值:
var mc = Regex.Matches(Server.UrlDecode(client.ResponseHeaders["Content-Disposition"]), @"filename=(.+)"); string filename = mc[0].Groups[1].Value;
4、Replace(Input,patter,replacement或evaluator [,options]) 替換
用給定的Replacement替換input中的匹配。
Console.WriteLine(Regex.Replace("this test*", "[^a-zA-Z]", "()")); //this()test() Console.WriteLine(Regex.Replace("sevenyear", @"\w+", m => { return m.Value.ToUpper(); }) ); //SEVENYEAR
5、Split(Input,patter[,options]) 拆分
在由模式定義的位置拆分input,返回string[]
string[] s = Regex.Split("first-second-thrid", "-"); for (int i = 0; i < s.Length; i++) { Console.WriteLine(s[i]); } //first //second //thrid
1、每4個長度進行分割
var temp = Regex.Split("1234abcdef", @"(?<=\G.{4})(?!$)"); temp.ToList().ForEach(t => Console.WriteLine(t)); //1234 //abcd //ef
2、提取單詞
var temp = Regex.Split("1234 abcd efa", @"(?<=\S+\b\s+)"); temp.ToList().ForEach(t => Console.WriteLine(t)); //1234 //abcd //ef
3、每兩個單詞進行分割
var temp = Regex.Split("1234,abcd,12345,abcd,ab", @"(?<=\G(?:\w+[,,]){2})"); temp.ToList().ForEach(t => Console.WriteLine(t)); //1234,abcd, //12345,abcd, //ab
6、實例化Regex類
Regex exp= new Regex(@"\w\.\w", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); MatchCollection mc = exp.Matches("a.b.c.d");
實例:
void Main() { string ss = "259年又62天"; MatchCollection mc = Regex.Matches(ss, @"(?:(?<year>\d+)年)?又?(?:(?<month>\d+)天)?"); for (int i = 0; i < mc.Count; i++) { Match match = mc[i]; Console.WriteLine("Match[" + i + "],Value:" + match.Value); for (int j = 0; j < match.Groups.Count; j++) { Group group = match.Groups[j]; Console.WriteLine("--Group[" + j + "],Name:" + group.Name + " ,Value:" + group.Value); for (int k = 0; k < group.Captures.Count; k++) { Console.WriteLine("------Captures[" + k + "],Value:" + group.Captures[k].Value); } } Console.WriteLine(); } }
Match[0],Value:259年又62天
--Group[0],Name:0? ,Value:259年又62天
------Captures[0],Value:259年又62天
--Group[1],Name:year? ,Value:259
------Captures[0],Value:259
--Group[2],Name:month? ,Value:62
------Captures[0],Value:62
Match[1],Value:
--Group[0],Name:0? ,Value:
------Captures[0],Value:
--Group[1],Name:year? ,Value:
--Group[2],Name:month? ,Value:
原文鏈接:https://www.cnblogs.com/springsnow/p/13267273.html
相關推薦
- 2022-08-14 協同開發巧用gitignore中間件避免網絡請求攜帶登錄信息_Golang
- 2022-10-20 Swift協議Protocol介紹_Swift
- 2022-09-19 Docker安裝部署單機版Rocket及基礎講解_docker
- 2022-08-29 Python實現數據的序列化操作詳解_python
- 2022-07-03 C++詳細講解函數調用與Struct和CLass的區別_C 語言
- 2022-09-02 Docker下Redis集群(主從+哨兵)安裝配置的實現步驟_docker
- 2023-03-17 redis中hash數據結構及說明_Redis
- 2023-08-16 el-col內容過長導致出現疊字錯誤
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支