这两个正则表达式有啥区别? (理解?量词)
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】:
您修改后的最终正则表达式需要分号。原始正则表达式将匹配只有空格的行。
由于意图(如果我理解正确的话)是忽略与此正则表达式匹配的行(作为 - 表面上 - 注释行),因此也忽略空行是有意义的。
【讨论】:
谢谢。您的评论加深了我的理解!以上是关于这两个正则表达式有啥区别? (理解?量词)的主要内容,如果未能解决你的问题,请参考以下文章