2016-08-19 76 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

谢谢。你的评论加强了我的理解! –