在“解析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*(;.*)
提前致谢。
答案 0 :(得分:6)
^\s*(;.*)
需要;
,它与空行不匹配。
^\s*(;.*)?
可以匹配一个空行,它不需要;
。
公共部分是^\s*
- 行(或字符串)的开头,然后是零或更多的空格。
然后1)(;.*)
匹配;
(强制执行1个实例),然后匹配除换行符之外的零个或多个字符,并且2)(;.*)?
匹配可选的序列((...)?
是一个可选组,因为?
是一个量化器,匹配量化原子的一次或零次,而 atom 可以是;
的符号,字符类,组),后跟除了换行符之外的0 +字符。
另外,请注意\s
匹配LF和CR符号,这意味着(如果MULTILINE修饰符为ON且输入是包含多行的文本),正则表达式^\s*
可能匹配多个行直到第一个非空白字符。
答案 1 :(得分:2)
您修改后的最终正则表达式需要分号。原始正则表达式将匹配仅为空格的行。
由于意图(如果我正确理解)是忽略这个正则表达式匹配的行(表面上是 - 注释行),所以也可以忽略空行。