这两个正则表达式之间有什么区别? (理解?量词)

时间:2016-08-19 15:01:27

标签: javascript regex quantifiers

在“解析INI文件”部分的书籍雄辩的JavaScript chapter 9: Regular Expressions下,有一个示例,其中包含一个我根本没有捕获的正则表达式。作者试图解析下一个内容:

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或\ u2029。”。所有这些仅限于{0,1}出场。

我在这里没有明确量词。我无法找到(regex101)任何不限制匹配字符串外观的情况都是个问题。为什么表达式与另一个表达式不同:

^\s*(;.*)

提前致谢。

2 个答案:

答案 0 :(得分:6)

^\s*(;.*)需要;,它与空行不匹配。

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

公共部分是^\s* - 行(或字符串)的开头,然后是零或更多的空格。

然后1)(;.*)匹配;(强制执行1个实例),然后匹配除换行符之外的零个或多个字符,并且2)(;.*)?匹配可选的序列(...)?是一个可选组,因为?是一个量化器,匹配量化原子的一次或零次,而 atom 可以是;的符号,字符类,),后跟除了换行符之外的0 +字符。

另外,请注意\s匹配LF和CR符号,这意味着(如果MULTILINE修饰符为ON且输入是包含多行的文本),正则表达式^\s*可能匹配多个行直到第一个非空白字符。

答案 1 :(得分:2)

您修改后的最终正则表达式需要分号。原始正则表达式将匹配仅为空格的行。

由于意图(如果我正确理解)是忽略这个正则表达式匹配的行(表面上是 - 注释行),所以也可以忽略空行。