在替换过程中在字符串中插入换行符

时间:2018-07-19 07:27:28

标签: regex powershell

我正在尝试在字符串中搜索一些数字,并在每个数字前插入新行,但不包括第一个。

我似乎无法使用传统的正则表达式\ 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等来试图强制换行,但在不失去功能的情况下无法实现包含当前的正则表达式变量。

3 个答案:

答案 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')

实际上与第二行代码非常相似。