Perl正则匹配输出整个文件,如何与Regex101结果一致?
问题解决:Perl正则匹配与Regex101表现一致的方法
你的正则在Regex101能正常匹配目标段落,但Perl命令输出整个文件的原因是:原正则没有明确限定段落的边界是空行。当Perl以整个文件为匹配对象时,(^\S.*\n)+会从文件开头第一个非空行一直匹配到目标行前,(\n^\S.*)+会从目标行后匹配到文件末尾的非空行,导致整个文件被匹配输出。
最优解决方法:使用Perl段落模式
直接利用Perl的段落模式(按空行分割段落),无需复杂正则,命令如下:
perl -00 -lne 'print if /font\.size = 12\.0/' teststring.txt
-00:启用段落模式,Perl将连续空行作为段落分隔符,每次读入一个完整段落。print if /font\.size = 12\.0/:筛选包含目标行的段落并输出。
正则修正方案(保持原匹配思路)
如果一定要用正则匹配整个段落,需要在正则中明确段落边界(空行或文件首尾),修正后的命令:
perl -lne 'BEGIN{undef $/;} print while /(?m)(?:^\s*$|\A)((?!^\s*$).*\n)*font\.size = 12\.0\n?((?!^\s*$).*\n)*(?:^\s*$|\Z)/g' teststring.txt
(?m):启用多行模式,让^/$匹配行首/行尾。(?:^\s*$|\A):匹配段落起始(文件开头或空行)。((?!^\s*$).*\n)*:匹配段落内非空行(直到空行)。(?:^\s*$|\Z):匹配段落结束(空行或文件末尾)。
验证输出
执行上述命令后,将得到预期结果:
[[heading]] # Complex Plane level = 1 greedy = true font.name = "CoFoRobert-Medium" font.size = 12.0 # font.size_tolerance = 1e-5 # font.color = 0x333333 # font.superscript = false # font.italic = false # font.serif = true # font.monospace = false # font.bold = false # bbox.left = 128.5 # bbox.top = 358.7200012207031 # bbox.right = 208.11978149414062 # bbox.bottom = 373.52801513671875 # bbox.tolerance = 1e-5
内容的提问来源于stack exchange,提问作者Signor Pizza
相关产品推荐
相关产品推荐

