2016-08-19 57 views
9

在書能言善辯的JavaScriptchapter 9: Regular Expressions下節「解析INI文件」有一個例子,其中包括正則表達式。我不明白的。筆者試圖解析下一個內容:這兩個正則表達式有什麼區別? (理解?量詞)

searchengine=http://www.google.com/search?q=$1 
spitefulness=9.7 

; comments are preceded by a semicolon... 
; each section concerns an individual enemy 
[larry] 
fullname=Larry Doe 
type=kindergarten bully 
website=http://www.geocities.com/CapeCanaveral/11451 

[gargamel] 
fullname=Gargamel 
type=evil sorcerer 
outputdir=/home/marijn/enemies/gargamel 

在規則上這種格式的狀態

空白行和開始用分號行被忽略。

解析此內容的代碼遍歷文件中的每一行。爲了處理評論,他包括這種表達

^\s*(;.*)? 

據我明白,這可能與的

空白字符的序列,包括空格,製表形式啓動該表達式的工藝線進料,進料線和其他 Unicode的空間

source),直到它出現分號;,然後是一行「」除行結束符之外的任何單個字符:\ n,\ r,\ u2028或\「。所有這些僅限於{0,1}外觀。

我不明白量詞在這裏。我無法找到(regex101)任何不限制匹配字符串外觀的情況。爲什麼這個表達與另一個不同:

^\s*(;.*) 

在此先感謝。

回答

6

^\s*(;.*)要求;,它不能匹配空白行。

^\s*(;.*)?可以匹配一個空行,它不需要;

通用部分是^\s* - 行(或字符串)的開頭,然後是零個或多個空格。

然後1)(;.*)強制性一個;(1實例)和換行除外接零個或多個字符相匹配,和2)(;.*)?可選序列(所述(...)?是任選的基團,因爲?是匹配量詞匹配量化原子的一次或零次出現,而原子可以是;的符號,字符類別,),而後跟0+字符而不是換行符。

另外,注意\s匹配的LF和CR碼元和表示(如果MULTILINE改性劑爲ON且輸入是包含多行文本)的正則表達式^\s*可以跨越多行匹配,直到第一個非空白字符。

+0

鏈接頁面上的文本表示輸入首先被分割成多行,因此不使用多行模式,並且不存在用於匹配'\ s *'的換行符。 (這引起了我的注意。) –

+0

好,我修改了*的答案(如果MULTILINE修飾符爲ON且輸入是包含多行的文本)*。這是未來讀者的一般注意事項。 –

+1

謝謝。我錯過了,表達式也必須匹配空行。感謝您回答如此之快。 –

2

您的修改後的最終正則表達式需要分號。原始的正則表達式將匹配只有空格的行。由於意圖(如果我理解正確)是忽略這個正則表達式匹配的行(如 - 表面上 - 註釋行),所以也可以忽略空行。

+0

謝謝。你的評論加強了我的理解! –

相關問題