这两个正则表达式有啥区别? (理解?量词)

Posted

技术标签:

【中文标题】这两个正则表达式有啥区别? (理解?量词)【英文标题】:What's the difference between this two regular expressions? (Understanding ? Quantifier)这两个正则表达式有什么区别? (理解?量词) 【发布时间】:2016-08-19 15:01:26 【问题描述】:

Eloquent JavaScript chapter 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

关于这种格式的规则说明

空白行和以分号开头的行将被忽略。

解析此内容的代码会遍历文件中的每一行。为了处理 cmets,他包含了这个表达式

^\s*(;.*)?

据我了解,这个表达式处理行可能以一系列

开头

空白字符,包括空格、制表符、换页符、换行符和 其他 Unicode 空间

(source) 直到它出现一个分号 ; 然后是一系列 "除行终止符之外的任何单个字符:\n、\r、\u2028 或 \u2029 .”。所有这些都仅限于 0,1 次出现。

我不明白量词 ? 的意义。我找不到 (regex101) 任何不限制匹配字符串的出现可能是问题的情况。为什么这个表达与另一个不同:

^\s*(;.*)

提前致谢。

【问题讨论】:

【参考方案1】:

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

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

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

那么 1) (;.*) 匹配 ;(必须 1 个实例),然后匹配除换行符以外的零个或多个字符,以及 2) (;.*)? 匹配可选的序列(@987654329 @ 是一个可选组,因为? 是一个量词,匹配一次或零次出现的量化原子,而原子 可以是符号、字符类、group) 的 ; 后跟 0+ 个字符而不是换行符。

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

【讨论】:

链接页面上的文字说输入首先被分成几行,所以不使用多行模式并且\s*没有换行符来匹配。 (这也引起了我的注意。) 好,我将答案修改为 (如果 MULTILINE 修饰符为 ON 并且输入是包含多行的文本)。这是给未来读者的一般说明。 谢谢。我错过了,表达式也必须匹配空行。谢谢你这么快回答。【参考方案2】:

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

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

【讨论】:

谢谢。您的评论加深了我的理解!

以上是关于这两个正则表达式有啥区别? (理解?量词)的主要内容,如果未能解决你的问题,请参考以下文章

java正则表达式-量词

正则表达式加与星号的区别? [复制]

正则表达式加与星号的区别? [复制]

正则表达式量词加号和星号之间的区别

正则表达式、linq表达式、lambda 表达式区别 ,这3者有啥关系和区别么?

正则表达式量词 - 两个字符之间的数量