正則表達式的使用

1、正則表達式-教程

  正則表達式:文本模式,包括普通字符(例如,a到z之間的字母)和特殊字符(稱為元字符)。

  正則表達式使用單個字符串來描述,匹配一系列匹配某個句法規則的字符串。

2、正則表達式-語法

  正則表達式描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。正則表達式是由普通字符(例如字符a-z)以及特殊字符(稱為“元字符”)組成的文字模式。模式描述在搜索文本時要匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。

2.1普通字符

  普通字符包括沒有顯示指定為元字符的所有可打印和不可打印字符。這包括所有大寫和小寫字符、所有數字、所有標點符號和一些其他符號。

?

2.2 非打印字符

  非打印字符也可以是正則表達式的組成部分。下列列出了表示非打印字符的轉義序列:

字符

描述

\cx

匹配由x指明的控制字符。比如\cM匹配一個Control-M或回車符。

x的值必須為A-Z或a-z之一。

\f

匹配一個換頁符。=\x0c或=\cL

\n

匹配一個換行符。=\x0a或\cJ

\r

匹配一個回車符。=\x0d和\cM

\s

匹配任何空白字符,包括空格、制表符、換頁符等待。=[\f\n\r\t\v]

\S

匹配任何非空白字符。=[^ \f\n\r\t\v]

\t

匹配一個制表符。=\x09和\cl

\v

匹配一個垂直制表符。=\x0b和 \cK

2.3 特殊字符

  特殊字符,就是有一些特殊含義字符。

特別字符

描述

$

匹配輸入字符串的結尾位置。如果要匹配本身,需要進行轉義,使用\$.

()

標記一個子表達式的開始和結束位置。

*

匹配前面的子表達式0或多次。如果要匹配本身,需要進行轉義,使用\*

+

匹配前面的子表達式1或多次。如果要匹配本身,需要進行轉義,使用\+

.

匹配除換行符\n之外的任何單個字符。匹配.,使用\.

[

標記一個中括號表達式的開始。要匹配[,使用\[

?

匹配前面的子表達式0或1次,或指明一個非貪婪限定符。要匹配?字符,使用\?

^

匹配輸入字符串的開始位置,除非在方括號表達式中使用,當該符號在方括號表達式中使用時,表示不接受該方括號表達式中的字符集合。要匹配^,使用\^

{

標記限定符表達式的開始。要匹配{,使用\{

|

指明兩項之間的一個選擇。要匹配|,請使用\|


2.4 限定符

  限定符用來指定正則表達式的一個給定組件必須要出現多少次才能滿足匹配。有*或+或?或{n}或{n,}或{n,m}共6種。正則表達式中的幾種重復模式。

正則表達式的限定符有:

字符(語法)

描述(說明)

*

匹配前面的子表達式0或多次。

+

匹配前面的子表達式1或多次。

匹配前面的子表達式0或1次。

{n}

n是一個非負整數。匹配確定的n次。

{n,}

n是一個非負整數,至少匹配n次。

{n,m}

m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。

*、+限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有它們的后面加上一個?就可以實現非貪婪或最小匹配。

貪婪:下面的表達式匹配從開始小于符號(<)到關閉大于符號(>)之間的所有內容。

比如:<h1>RUNOOB-菜鳥教程</h1>

/<.*>/?

非貪婪:如果您只需要匹配開始和結束h1標簽,下面的非貪婪表達式只匹配<h1>。

/<.*?>/?

2.5定位符

定位符能使正則表達式固定到行首或行尾。定位符用來描述字符串或單詞的邊界,^和$分別指字符串的開始與結束,\b描述單詞的前或后邊界,\B表示非單詞邊界。

字符

描述

^

匹配輸入字符串開始的位置。

$

匹配輸入字符串結尾的位置。

\b

匹配一個單詞邊界,即字與空格間的位置。

\B

非單詞邊界匹配。比如chapter和aptitude,apt出現在單詞chapter中的非單詞邊界處,但出現在單詞aptitude中的單詞邊界處。

注意:不能將限定符與定位符一起使用。由于在緊靠換行或單詞邊界的前面或后面不能有一個以上位置,因為不允許諸如^*之類的表達式。

選擇:用圓括號將所有選擇項括起來,相鄰的選擇項之間用|分隔。但用圓括號會有一個副作用,使相關的匹配會被緩存,此時可用?:放在第一個選項前來消除這種副作用。

其中?:是非捕獲元之一,還有兩個非捕獲元是?=和?!。

?=:正向預查,在任何開始匹配圓括號內的正則表達式的位置來匹配搜索字符串。

?!:負向預查,在任何開始不匹配該正則表達式模式的位置來匹配搜索字符串。

反向引用:對一個正則表達式模式或部分模式兩邊添加圓括號將導致相關匹配存儲到一個臨時緩沖區中,所捕獲的每個子匹配都按照在正則表達式中從左到右出現的順序存儲。緩沖區編號從1開始,最多可存儲99個捕獲的子表達式。

可以使用非捕獲元字符?:,?=;?!來重寫捕獲,忽略對相關匹配的保存。

比如例子1:Is is the cost of of gasoline going up up?

該正則表達式:/\b([a-z]+) \1\b/ig ??#[a-z]+ 表示1個或多個字母。\1指定第一個子匹配項。g表示全局變量,i忽略大小寫。

例子2:要匹配taobao taobao ,home home這樣的情況如何處理?

正則表達式:\b(\w+)\b\s+\1\b

正則表達式給匹配項命名:\b(?<Word>\w+)\b\s+\k<Word>\b

? ? ? ? ? ? ? ??

?

3、正則表達式-元字符

字符

描述

\

將下一個字符標記為特殊字符、或原義字符、或向后引用、或八進制轉義符。例如n 匹配字符n,\n匹配換行符。匹配\,使用\\;匹配(,使用\(

^

匹配輸入字符串的開始位置,除非在方括號表達式中使用,當該符號在方括號表達式中使用時,表示不接受該方括號表達式中的字符集合。要匹配^,使用\^

$

匹配輸入字符串的結尾位置。如果要匹配本身,需要進行轉義,使用\$.

*

匹配前面的子表達式0或多次。

+

匹配前面的子表達式1或多次。如果要匹配本身,需要進行轉義,使用\+

匹配前面的子表達式0或1次,或指明一個非貪婪限定符。要匹配?字符,使用\?

{n}

n是一個非負整數。匹配確定的n次。

{n,}

n是一個非負整數,至少匹配n次。

當該字符緊跟在任何一個其他限制符(*、+、?、{n}、{n,}、{n,m})后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如對于字符串"oooo",'0+?'將匹配單個"o","o+"將匹配所有'o'.

.

匹配除換行符\n之外的任何單個字符。匹配.,使用\.

(pattern)

匹配pattern并獲取這一匹配。

(?:pattern)

匹配pattern但不獲取這一匹配,即這是一個非獲取匹配,不進行存儲供以后使用。比如'industr(?:y|ies)就是一個比'industry|industries'更簡單的表達式。

(?=pattern)

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

(?!pattern)

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

(?<=pattern)

反向(look behind)肯定預查,與正向肯定預查方向相反。比如“(?<=95|98|NT|2000)windows”能匹配2000windows中的windows,但不能匹配3.1windows中的windows.

(?<!parttern)

反向(look behind)否定預查,與正向否定預查方向相反。比如“(?<!95|98|NT|2000)windows”不能匹配2000windows中的windows,但能匹配3.1windows中的windows.

x|y

匹配x或y。比如,'z|food'能匹配'z'或'food'。‘(z|f)ood’則匹配"zood"或"food".

[xyz]

字符集合。匹配所包含的任意一個字符。比如'[abc]'可以匹配'plain'中的'a'.

[^xyz]

負值字符集合。匹配未包含的任意字符,例如'[^abc]'可以匹配’plain'中的‘p’、'l'、'i'、'n'.

[a-z]

字符范圍。匹配指定范圍內的任意字符。例如'[a-z]'可以匹配'a'到'z'范圍內的任意小寫字母字符。

[^a-z}

負值字符范圍。匹配任何不在指定范圍內的任意字符。例如'[^a-z]'可以匹配任何不在'a'到'z'范圍內的任意小寫字符。

\b

匹配一個單詞邊界,即字與空格間的位置。例如,'er\b'可以匹配"never"中的"er",但不能匹配"verb"中的"er"

\B

匹配非單詞邊界。例如,'er\B'不可以匹配"never"中的"er",但能匹配"verb"中的"er"

\cx

匹配由x指明的控制字符。比如\cM匹配一個Control-M或回車符。x的值必須為A-Z或a-z之一。

\d

匹配一個數字字符。等價于[0-9]

\D

匹配一個非數字字符。等價于[^0-9]

\f

匹配一個換頁符。等價于\x0c和=\cL

\n

匹配一個換行符。等價于\x0a或\cJ

\r

匹配一個回車符。等價于\x0d和\cM

\s

匹配任何空白字符,包括空格、制表符、換頁符等待。=[\f\n\r\t\v]

\S

匹配任何非空白字符。=[^ \f\n\r\t\v]

\t

匹配一個制表符。=\x09和\cl

\v

匹配一個垂直制表符。=\x0b和 \cK

\w

匹配字母、數字、下劃線。等價于[A-Za-z0-9_]

\W

匹配非字母、數字、下劃線。等價于[^A-Za-z0-9_]

\xn

匹配n,其中n為十六進制轉義值。例如'\x41'匹配“A”。'\x041'則等價于‘\x04' & '1'.

\num

匹配num.

\n

標識一個八進制轉義值或一個向后引用。如果 \n 之前至少 n 個獲取的子表達式,則 n 為向后引用。否則,如果 n 為八進制數字 (0-7),則 n 為一個八進制轉義值。

\nm

標識一個八進制轉義值或一個向后引用。如果 \nm 之前至少有 nm 個獲得子表達式,則 nm 為向后引用。如果 \nm 之前至少有 n 個獲取,則 n 為一個后跟文字 m 的向后引用。如果前面的條件都不滿足,若 n 和 m 均為八進制數字 (0-7),則 \nm 將匹配八進制轉義值 nm。

\nml

如果 n 為八進制數字 (0-3),且 m 和 l 均為八進制數字 (0-7),則匹配八進制轉義值 nml。

\un

匹配 n,其中 n 是一個用四個十六進制數字表示的 Unicode 字符。例如, \u00A9 匹配版權符號 (?)。

其中零寬斷言:

?=exp 零寬度正預測先行斷言,自身出現的位置的后面能匹配表達式exp。

比如:I’m?singing while you’re?dancing.

正則表達式:\b\w+(?=ing\b)

?<=exp 零寬度正向顧后發斷言,自身出現的位置的前面能匹配表達式exp.

比如:reading?a book

正則表達式:(?<=\bre)\w+\b

負向零寬斷言:

查找這樣的單詞--它里面出現了字母q,但是q后面跟的不是字母u。

正則表達式:\b\w*q[^u]\w*\b,存在一個問題,[^u]占位的問題。

?!=exp 負向零寬斷言:\b\w*q(?!u)\w*\b 并不消費任何字符

\d{3}(?!\d)匹配3位數字,而且這3位數字的后面不能是數字。

\b((?!abc)\w)+\b匹配不包含連續字符串abc的單詞。

?<! 零寬度負回顧后發斷言。

(?<![a-z])\d{7} 匹配前面不是小寫字母的七位數字。

4、正則表達式-運算符優先級

正則表達式從左到右進行計算,并遵循優先級順序,與算數表達式類似。

相同優先級的從左到右進行計算,不同優先級的運算先高后低。

運算符

描述

\

轉義符

(),(?:),(?=),[]

圓括號和方括號

*,+,?,{n},{n,},{n,m}

限定符

^,$,\任意元字符,任意字符

定點位和序列(即:位置和順序)

|

替換,“或”操作,字符具有高于替換運算符的優先級,使得"m|food"匹配"m"或"food"。如要匹配"mood"或"food",請使用括號創建子表達式,從而產生"(m|f)ood"

5、正則表達式-匹配規則

5.1 基本模式匹配

模式:正則表達式最基本的元素,它們是一組描述字符串特征的字符。比如:

^once 包含了特殊字符^,表示開頭,表示該模式只匹配以once開頭的字符串。匹配”once upon a time”,不匹配”There once was a man from NewYork”.

bucket$ ,$符號用來匹配那些以給定模式結尾的字符串。匹配”who kept all of this cash in a bucket”,不匹配buckets.

^bucket$ 同時使用^和$,表示精確匹配.

5.2 字符簇

字符簇:描述我們要的模式的方法。要建立一個表示所有元音字符的字符簇,就把所有的元音字符放在一個方括號里:[AaEeIiOoUu].

[a-z] //匹配所有的小寫字母

[A-Z] //匹配所有的大寫字母

[a-zA-Z] ? //匹配所有的字母

[0-9] ==\d //匹配所有的數字

[a-z0-9A-Z_]==\w ?//匹配所有的字母、數字、下劃線

[0-9\.\-] ? //匹配所有的數字,句號和減號

[ \f\r\t\n] ??//匹配所有的白字符

6 正則表達式-示例

6.1 簡單表達式

正則表達式最簡單形式實在搜索字符串中匹配其本身的單個普通字符。例如,單字符模式,同事也可以將血多單字符組合起來以形成大的表達式。(不需要串聯運算符,只需要在一個字符后面鍵入另一個字符)

/a/

/7/

/M/

/a7M/

6.2 字符匹配

句點(.)匹配字符串中的各種打印或非打印字符,只有一個字符例外(換行符\n)。比如aac、abc、acc、adc、a1c、a2c、a-c、a#c。

/a.c/

6.3 中括號表達式

若要創建匹配字符組的一個列表,請在方括號([和])內放置一個或更多單個字符。當字符括在中括號內時,該列表稱為”中括號表達式”。

比如Chapter1、Chapter2、Chapter3、Chapter4、Chapter5。

如上用正則表達式為:/Chapter [12345]/ ??或者/Chapter [1-5]/

6.4 替換和分組

替換使用|字符來語序在兩個或多個替換選項之間進行選擇。例如,可以擴展章節標題正則表達式,以返回比章節標題更廣的匹配項。

比如:/^Chapter|Section [1-9][0-9]{0,1}$/

該表達式要么匹配行首的Chapter,要么匹配行尾的單詞Section及跟在其后的任何數字。

比如:/^(Chapter|Section) [1-9][0-9]{0,1}$/

該表達式周圍的括號捕獲兩個匹配字中的任一個供以后使用。

分組將子表達式進行做成子集,使用()進行分組,方便對match的字符串進行劃分。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36572.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36572.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《論文閱讀13》Efficient Urban-scale Point Clouds Segmentationwith BEV Projection

一、論文 研究領域&#xff1a; 城市級3D語義分割論文&#xff1a;Efficient Urban-scale Point Clouds Segmentationwith BEV Projection清華大學&#xff0c;新疆大學2021.9.19論文github論文鏈接 二、論文概要 2.1主要思路 提出了城市級3D語義分割新的方法&#xff0c;將…

1.SpringMVC接收請求參數及數據回顯:前端url地址欄傳遞參數通過轉發顯示在網頁

1、SpringMVC 處理前端提交的數據 1.1 提交的域名和處理方法的參數不一致&#xff0c;使用注解解決 1.2 提交的域名和處理方法的參數不一致&#xff0c;使用注解解決 1.3 提交的是一個對象 2、前端url地址欄傳遞的是一個參數 請求地址url&#xff1a;http://localhost:8080/s…

測試開發工程師到底是做什么的?

一二三線互聯網公司對測試開發工程師的要求&#xff1a; 現在很多測試的同事對測試開發工程師的認識都有一定的誤差。 我最早在阿里的時候和測試開發工程師溝通的時候&#xff0c;發現阿里的測試開發工程師&#xff0c;他們基本上都分為兩種&#xff0c;一種是業務類型的&…

Python基礎教程: json序列化詳細用法介紹

前言 嗨嘍&#xff0c;大家好呀~這里是愛看美女的茜茜吶 Python內置的json模塊提供了非常完善的對象到JSON格式的轉換。 廢話不多說&#xff0c;我們先看看如何把Python對象變成一個JSON&#xff1a; d dict(nameKaven, age17, sexMale) print(json.dumps(d)) # {"na…

【Linux】環境變量

目錄 一、環境變量的概念二、 常見的環境變量1.查看環境變量的方法2.PATH3.HOME4.SHELL 三、環境變量的相關指令四、命令行參數 一、環境變量的概念 環境變量(environment variables)一般是指在操作系統中用來指定操作系統運行環境的一些參數 如&#xff1a;我們在編寫C/C代碼的…

Prometheus技術文檔-基本使用-配置文件全解!!!!!

簡介&#xff1a; Prometheus是一個開源的系統監控和告警系統&#xff0c;由Google的BorgMon監控系統發展而來。它主要用于監控和度量各種時間序列數據&#xff0c;比如系統性能、網絡延遲、應用程序錯誤等。Prometheus通過采集監控數據并存儲在時間序列數據庫中&#xff0c;…

【視頻】使用OBS將MP4推流至騰訊云直播

1、下載OBS OBS官網:https://obsproject.com/ OBS支持Win、Mac、Linux,如果下載速度很慢,建議使用迅雷下載 2、OBS推流設置 2.1 添加場景 默認會有一個“場景”,如果想繼續添加可以點擊“+”按鈕 2.2 添加媒體源 1)點擊“來源”窗口中“+”按鈕 2)支持的媒體源如…

什么是Redis緩存雪崩、緩存穿透、緩存擊穿

緩存穿透&#xff08;Cache Penetration&#xff09; 什么是緩存穿透&#xff1f; 緩存穿透是指惡意或無效的請求導致緩存無法命中&#xff0c;從而每個請求都需要訪問數據庫。這可能發生在請求的數據根本不存在于緩存和數據庫中。 緩存穿透解決方案 使用布隆過濾器&#x…

安裝Tomac服務器——安裝步驟以及易出現問題的解決方法

文章目錄 前言 一、下載Tomcat及解壓 1、選擇下載版本&#xff08;本文選擇tomcat 8版本為例&#xff09; 2、解壓安裝包 二、配置環境 1、在電腦搜索欄里面搜索環境變量即可 2、點擊高級系統設置->環境變量->新建系統變量 1) 新建系統變量&#xff0c;變量名為…

【學會動態規劃】最大子數組和(19)

目錄 動態規劃怎么學&#xff1f; 1. 題目解析 2. 算法原理 1. 狀態表示 2. 狀態轉移方程 3. 初始化 4. 填表順序 5. 返回值 3. 代碼編寫 寫在最后&#xff1a; 動態規劃怎么學&#xff1f; 學習一個算法沒有捷徑&#xff0c;更何況是學習動態規劃&#xff0c; 跟我…

LeetCode 0088. 合并兩個有序數組

【LetMeFly】88.合并兩個有序數組&#xff1a;O(m 1) O(1)的做法 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/merge-sorted-array/ 給你兩個按 非遞減順序 排列的整數數組 nums1 和 nums2&#xff0c;另有兩個整數 m 和 n &#xff0c;分別表示 nums1 和 nums2…

Linux:Shell編輯之文本處理器(sed)

目錄 緒論 1、sed的原理&#xff1a;讀取 執行 顯示 三個過程 2、sed 文本內容處理工具&#xff0c;文件過大怎么辦&#xff1f; 3、sed的操作選項 3.1 常用選項 3.2 操作符 3.3 行號的范圍打印 3.4 對包含指定字符串的內容進行打印 3.5 刪 3.5.1 正則表達式刪除 3.6…

一個工作簿中的多個工作表拆分成多個工作簿

在Excel 2016中將一個工作簿中的多個工作表拆分成多個工作簿&#xff0c;在開發工具中的vba 模塊中輸入一下代碼&#xff08;并修改savepath的值為要存儲的路徑&#xff09;&#xff0c;然后運行即可。 Sub SplitWorkbook()Dim srcWorkbook As WorkbookDim srcWorksheet As Wo…

深入淺出 棧和隊列(附加循環隊列、雙端隊列)

棧和隊列 一、棧 概念與特性二、Stack 集合類及模擬實現1、Java集合中的 Stack2、Stack 模擬實現 三、棧、虛擬機棧、棧幀有什么區別&#xff1f;四、隊列 概念與特性五、Queue集合類及模擬實現1、Queue的底層結構&#xff08;1&#xff09;順序結構&#xff08;2&#xff09;鏈…

Golang-使用 gvm 進行版本控制

當你想為每個項目切換 go 版本時&#xff0c;gvm (Go Version Manager) 很方便。 這里&#xff0c;我將介紹“如何在Mac上安裝gvm”和“如何使用gvm” 使用準備 僅適用于 Mac 的準備工作 按照MacOSX 要求中的說明執行以下命令。 xcode-select --install brew update brew …

C++(Qt)軟件調試---將調試工具安裝到AeDebug(11)

C(Qt)軟件調試—將調試工具安裝到AeDebug&#xff08;11&#xff09; 文章目錄 C(Qt)軟件調試---將調試工具安裝到AeDebug&#xff08;11&#xff09;1、前言1.1 使用的調試工具 2、調試器安裝1.1 WinDbg1.2 procdump1.3 DrMinGW1.4 vsjitdebugger 更多精彩內容&#x1f449;個…

深入了解Linux運維的重要性與最佳實踐

Linux作為開源操作系統的代表&#xff0c;在企業級環境中的應用越來越廣泛。而在保障Linux系統的正常運行和管理方面&#xff0c;Linux運維顯得尤為關鍵。本文將介紹Linux運維的重要性以及一些最佳實踐&#xff0c;幫助讀者更好地了解和掌握Linux系統的運維技巧。 首先&#xf…

OPENCV C++(十)gramm矯正+直方圖均衡化

兩者都是只對單通道使用&#xff0c;對多通道的話 就需要分離通道處理再合并通道 兩種方法&#xff0c;第一個要運算次數太多了&#xff0c;第二個只需要查表 伽馬矯正函數&#xff0c;這里用第二種方法&#xff0c;且寫法有點高級 int gammaCorrection(cv::Mat srcMat, cv::…

Java【Spring】使用注解, 更簡單的存儲和獲取 Bean

文章目錄 前言一、存儲 Bean1, 配置文件2, 五大類注解Bean 的命名規則 3, 方法注解Bean 的命名規則 二、獲取 Bean1, 屬性注入2, Setter 注入3, 構造方法注入4, Autowired 和 Resource 的區別5, 同一個類型的多個 Bean 注入問題 總結 前言 各位讀者好, 我是小陳, 這是我的個人主…

【網絡基礎實戰之路】實現RIP協議與OSPF協議間路由交流的實戰詳解

系列文章傳送門&#xff1a; 【網絡基礎實戰之路】設計網絡劃分的實戰詳解 【網絡基礎實戰之路】一文弄懂TCP的三次握手與四次斷開 【網絡基礎實戰之路】基于MGRE多點協議的實戰詳解 【網絡基礎實戰之路】基于OSPF協議建立兩個MGRE網絡的實驗詳解 PS&#xff1a;本要求基于…