正则表达式 – 与grep的非贪婪匹配
据我所知,非贪心匹配不是基本正则表达式(BRE)和扩展正则表达式(ERE)的一部分.但是,不同版本的grep(BSD和GNU)上的行为似乎表明其他方面.
例如,我们来看下面的例子.我有一个字符串说: string="hello_my_dear_polo" 使用GNU grep: 以下几次尝试从字符串中提取hello. BRE尝试: $grep -o "hel.*?o" <<< "$string" hello_my_dear_polo 输出产生整个字符串,这表明非贪婪量词对BRE不起作用.请注意,我只是逃脱了?因为*不会失去它的含义,也不需要逃脱. ERE尝试: $grep -oE "hel.*?o" <<< "$string" hello_my_dear_polo 启用-E选项也会产生相同的输出,表明非贪婪匹配不是ERE的一部分.由于我们使用ERE,因此不需要转义. PCRE尝试: $grep -oP "hel.*?o" <<< "$string" hello 为PCRE启用-P选项表明非贪心量词是其中的一部分,因此我们得到了所需的hello输出.由于我们使用PCRE,因此不需要转义. 使用BSD grep: 以下是从字符串中提取hello的几次尝试. BRE尝试: $grep -o "hel.*?o" <<< "$string" 使用BRE我没有得到BSD grep的输出. ERE尝试: $grep -oE "hel.*?o" <<< "$string" hello 启用-E选项后,我很惊讶我能够提取所需的输出.我的问题是我从这次尝试得到的输出. PCRE尝试: $grep -oP "hel.*?o" <<< "$string" usage: grep [-abcDEFGHhIiJLlmnOoPqRSsUVvwxZ] [-A num] [-B num] [-C[num]] [-e pattern] [-f file] [--binary-files=value] [--color=when] [--context[=num]] [--directories=action] [--label] [--line-buffered] [--null] [pattern] [file ...] 使用-P选项给了我使用错误,这是预期的,因为grep的BSD选项不支持PCRE. 所以我的问题是为什么在BSD grep上使用ERE会使用非贪婪量词而不是GNU grep来产生正确的输出. 这是一个错误,BSD egrep的未记录特征还是我对输出的错误理解?
双量词只是一个语法错误,可能导致错误消息或未定义的行为.如果您收到错误消息,可能会更好.
Perl对正则表达式后日期POSIX的扩展很大;在编写这些工具时,人们极不可能尝试将这种古怪的语法用于任何事情.贪婪匹配仅在20世纪90年代中期在Perl 5中引入. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |