You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.05 17:13:09