如何编写正则表达式匹配每段set private-key至加密私钥结束的完整内容
问题描述
我需要编写正则表达式,从给定文本中匹配出3段同时包含set private-key和-----END ENCRYPTED PRIVATE KEY-----"的内容,且需包含这两行本身。我已有匹配起始行的表达式^.*set private-key.*$和匹配结束行的表达式^-----END ENCRYPTED PRIVATE KEY-----"$,但合并为^.*set private-key.*$[\s\S]*^-----END ENCRYPTED PRIVATE KEY-----"$时,会选中第一个起始行到最后一个结束行之间的所有内容,无法单独匹配每一段,特此求助。
示例文本
set comments "This is a comment " set private-key "-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIpQqr96DiyZICAggA\nMIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIpQqr96DiyZICAggA\nMIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIpQqr96DiyZICAggA\n-----END ENCRYPTED PRIVATE KEY-----"\n\n set range global\n set source factory\n set last-updated 1546857127\n next\n edit "nothing important"\n set password ENC b1yM5KXgCoMcQ5Nc8zXW4RUgQe2XnxnVw3JDavLkx7L/dMwEudi2CuZDVEnqaoP/K3oKQb7r0WMwblzPu3sBzJkrSP28WQ==\n set comments "This is another comment"\n set private-key "-----BEGIN ENCRYPTED PRIVATE KEY-----\nJzW9TfmKu1lfYq/edslhke7RVPRpJ/Xu+Asbwd/P1qn/ffGbv713Xtyy95zBQbRe\n8u1I3cGvr8LMHsMOdgFuHMr0OcVp7B9amCKQeXQImXK1SXHnZjPuIw7IYBlX1jvN\nMIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIpQqr96DiyZICAggA\n-----END ENCRYPTED PRIVATE KEY-----"\n next\n edit "nothing important"\n set password ENC b1yM5KXgCoMcQ5Nc8zXW4RUgQe2XnxnVw3JDavLkx7L/dMwEudi2CuZDVEnqaoP/K3oKQb7r0WMwblzPu3sBzJkrSP28WQ==\n set comments "This is another comment"\n set private-key "-----BEGIN ENCRYPTED PRIVATE KEY-----\nJzW9TfmKu1lfYq/edslhke7RVPRpJ/Xu+Asbwd/P1qn/ffGbv713Xtyy95zBQbRe\n8u1I3cGvr8LMHsMOdgFuHMr0OcVp7B9amCKQeXQImXK1SXHnZjPuIw7IYBlX1jvN\nMIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIpQqr96DiyZICAggA\n-----END ENCRYPTED PRIVATE KEY-----"\n edit "nothing important"\n set password ENC b1yM5KXgCoMcQ5Nc8zXW4RUgQe2XnxnVw3JDavLkx7L/dMwEudi2CuZDVEnqaoP/K3oKQb7r0WMwblzPu3sBzJkrSP28WQ==\n set private-key "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABDyqjjtjF\nb3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABDyqjjtjF\nb3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABDyqjjtjF\nXUq7T96YiMJWNG4w==\n-----END OPENSSH PRIVATE KEY-----\n"\n\n``` ## 解决方案 ### 修正后的正则表达式 ```regex ^.*set private-key.*$[\s\S]*?^-----END ENCRYPTED PRIVATE KEY-----"$
需配合**多行模式(Multiline Mode,标记为m)**使用,不同场景的开启方式:
- JavaScript:
/^.*set private-key.*$[\s\S]*?^-----END ENCRYPTED PRIVATE KEY-----"$/gm - Python:
re.findall(r'^.*set private-key.*$[\s\S]*?^-----END ENCRYPTED PRIVATE KEY-----"$', text, re.MULTILINE) - 在线正则工具:直接勾选"多行模式"选项
原理说明
- 原表达式中的
[\s\S]*是贪婪匹配规则,会尽可能覆盖更多内容,导致从第一个起始行直接匹配到最后一个结束行。 - 改为
[\s\S]*?后切换为非贪婪匹配,会在遇到第一个符合条件的结束行时停止匹配,实现逐段提取目标内容。 - 多行模式的作用是让
^和$能够匹配每行的首尾,而非整个文本的首尾,确保起始行和结束行的匹配精度。
内容的提问来源于stack exchange,提问作者Dan Sherwin
相关产品推荐
相关产品推荐

