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

9

在书籍《JavaScript精通》的第9章:正则表达式中,关于“解析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空格字符 (来源),直到出现分号;,然后是一系列“任何单个字符,除了行终止符:\n、\r、\u2028或\u2029。”所有这些都受限于{0,1}的出现。
我不明白为什么要在此处使用量词?。我找不到任何一个情况(regex101),在匹配字符串的数量没有限制时会出现问题。为什么这个表达式与另一个表达式不同:
^\s*(;.*)

Thanks in advance.

2个回答

6
^\s*(;.*)需要一个;,它不能匹配空行。 ^\s*(;.*)?可以匹配空行,它不需要;
公共部分是^\s* - 行(或字符串)的开头,然后是零个或多个空格字符。
然后1)(;.*)匹配一个;(一个实例是必需的),然后是除换行符之外的零个或多个字符,2)(;.*)?匹配可选的序列(...)?是一个可选组,因为?是一个量词,匹配量化原子的一个或零个出现,而这个原子可以是一个符号、一个字符类或一个),包含了一个;,后面是0个或多个不包含换行符的字符。
另外,请注意\s匹配LF和CR符号,这意味着(如果MULTILINE修饰符被打开并且输入是包含多行文本的),正则表达式^\s*可能跨多行进行匹配,直到第一个非空格字符。

链接页面上的文本说输入首先被分成行,因此不使用多行模式,也没有新行可以匹配\s*。(这也引起了我的注意。) - Alan Moore
好的,我修改了答案 *(如果MULTILINE修饰符为ON且输入为包含多行文本的文本)*。这是一个给未来读者的通用提示。 - Wiktor Stribiżew
1
谢谢。我错过了,表达式也必须匹配空行。感谢您的快速回答。 - Noob_Number_1

2

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

由于意图(如果我理解正确)是忽略此正则表达式匹配的行(作为注释行),因此忽略空行也是有意义的。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接