我正在尝试在字符串中搜索一些数字,并在每个数字前插入新行,但不包括第一个。
我似乎无法使用传统的正则表达式\ n char插入换行符。如果我使用PowerShell转义字符,则该集合中的regex变量将被忽略。
对于给定的源字符串
$theString = "1. First line 2. Second line 3. Third line"
我想要的是:
1. First Line 2. Second Line 3. Third line
因此,我尝试使用此正则表达式查找数字2至9,后跟一个句点和一个空格:
$theString = $theString -replace '([2-9]\. )','\n$1'
但是会产生:
1. First line\n2. Second line\n3. Third line
因此,我尝试将PowerShell转义字符用于换行符,并将其放在双引号中:
$theString = $theString -replace '([2-9]\. )',"`n$1"
但是会产生:
1. First Line Second Line Third line
我尝试使用\r
,\r\n
,\`r
,\`r\`n
等来试图强制换行,但在不失去功能的情况下无法实现包含当前的正则表达式变量。
答案 0 :(得分:3)
该问题是由于$
同时用于普通Powershell变量和捕获组而引起的。为了将其作为捕获组标识符进行处理,需要使用单引号'
。但是单引号告诉Powershell不要将换行符解释为换行符,而应将其解释为文字`n
。
用两个不同引号引起来的字符串就可以了。像这样
$theString -replace '([2-9]\. )', $("`n"+'$1')
1. First line
2. Second line
3. Third line
或者,使用双引号"
来使美元转义。像这样
$theString -replace '([2-9]\. )', "`n`$1"
1. First line
2. Second line
3. Third line
还有另一个替代方法(感谢Lieven)使用这里字符串。此处字符串包含换行符。也许变量使它更易于使用。像这样
$repl = @'
$1
'@
$theString -replace '([2-9]\. )', $repl
1. First line
2. Second line
3. Third line
答案 1 :(得分:1)
要允许使用任何数字,我会用换行符替换前导空格,并使用positive look ahead进行过滤。
$theString = "1. First line 2. Second line 3. Third line 11. Eleventh line"
$thestring -replace ' (?=[1-9]+\. )', "`n"
示例输出:
1. First line
2. Second line
3. Third line
11. Eleventh line
要使用相同的RegEx获得字符串输出数组:
$thestring -split ' (?=[1-9]+\. )'
答案 2 :(得分:0)
另一个解决方案是:
$theString = "1. First line 2. Second line 3. Third line"
$theString -replace '(\s)([0-9]+\.)',([System.Environment]::NewLine+'$2')
实际上与第二行代码非常相似。