PowerShell中Regex选择性插入换行失效问题求助
问题:在PowerShell中为列表块前后添加换行符
我通过$String = Get-Content -Path 'c:\temp\mytext.txt' -Raw将文本导入为单个字符串,原始内容如下:
Lorem ipsum et cras praesent mollis ullamcorper laoreet mauris imperdiet quisque - red - green - blue Lorem ipsum et cras praesent mollis ullamcorper laoreet mauris imperdiet quisque ac adipiscing mauris ante class placerat per sem quisque phasellus sociosqu, mollis - red - green - blue bluorem ipsum et cras praesent mollis ullamcorper laoreet mauris imperdiet quisque
需求是:在每一组以-开头的行的第一行前添加换行,最后一行后添加换行,期望输出如下:
Lorem ipsum et cras praesent mollis ullamcorper laoreet mauris imperdiet quisque - red - green - blue Lorem ipsum et cras praesent mollis ullamcorper laoreet mauris imperdiet quisque ac adipiscing mauris ante class placerat per sem quisque phasellus sociosqu, mollis - red - green - blue bluorem ipsum et cras praesent mollis ullamcorper laoreet mauris imperdiet quisque
我之前尝试的正则在测试工具中有效,但在PowerShell中出现问题:
- 针对列表开头:使用
\n[^-].*(\n)-\s替换为\n$1时会截断行 - 针对列表结尾:使用
\n-\s.*(\n)[^-]替换为$1\n时出现异常
解决方案
可以通过两个精准的正则替换分别处理列表块的前后换行需求:
1. 为列表块开头添加换行
匹配非列表行末尾紧跟列表起始行的场景,在中间插入换行:
$String = $String -replace '(?<!- )(.*?)\n- ', "`$1`n`n- "
(?<!- ):负向后行断言,确保匹配位置前不是列表行的结尾,避免误匹配列表内部的换行(.*?)\n-:匹配非列表行内容及后续的列表起始行开头- 替换后保留原非列表行,在中间插入一个换行再接列表起始行
2. 为列表块结尾添加换行
匹配列表最后一行(后续无其他列表行),在该行末尾添加换行:
$String = $String -replace '(- .*?)\n(?!-)', "`$1`n`n"
(- .*?)\n:匹配单个列表行内容及后续换行(?!-):负向前瞻断言,确保下一行不以-开头(即当前行是列表的最后一行)- 替换后保留原列表行,在末尾多添加一个换行
完整执行代码
$String = Get-Content -Path 'c:\temp\mytext.txt' -Raw # 处理列表开头换行 $String = $String -replace '(?<!- )(.*?)\n- ', "`$1`n`n- " # 处理列表结尾换行 $String = $String -replace '(- .*?)\n(?!-)', "`$1`n`n" # 输出结果 $String
原正则问题分析
- 开头的正则
\n[^-].*(\n)-\s使用贪婪匹配.*,会意外覆盖多行内容,同时未排除列表内部的换行场景,导致行截断 - 结尾的正则
\n-\s.*(\n)[^-]同样存在贪婪匹配问题,且未正确断言后续行是否为列表行,导致替换异常
内容的提问来源于stack exchange,提问作者Ralf_Reddings
相关产品推荐
相关产品推荐

