PowerShell - 在正则表达式替换期间在字符串中插入换行符

Dav*_*ers 5 regex powershell

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

我似乎无法使用传统的正则表达式 \n char 来插入换行符。如果我使用 PowerShell 转义字符,则该集中的正则表达式变量将被忽略。

对于给定的源字符串

$theString = "1. First line 2. Second line 3. Third line"
Run Code Online (Sandbox Code Playgroud)

我想要的是:

1. 第一行
2. 第二线
3.第三行

所以我尝试使用这个正则表达式来查找数字 2 到 9,后跟句点和空格:

$theString = $theString -replace '([2-9]\. )','\n$1'
Run Code Online (Sandbox Code Playgroud)

但这会产生:

1. 第一行\n2. 第二行\n3. 第三线

所以我尝试使用 PowerShell 转义字符作为换行符并将其放在双引号内:

$theString = $theString -replace '([2-9]\. )',"`n$1"
Run Code Online (Sandbox Code Playgroud)

但这会产生:

1. 第一行
第二行
第三线

我尝试使用\r\r\n\`r\`r\`n等尝试强制换行,但无法在不失去包含当前正则表达式变量的能力的情况下实现换行。

von*_*ryz 4

该问题是由于$用于普通 Powershell 变量和捕获组而引起的。为了将其作为捕获组标识符进行处理,'需要单引号。但单引号告诉 Powershell 不要将换行转义解释为换行而是字面量`n

连接两个不同引用的字符串就可以了。就像这样,

$theString -replace '([2-9]\. )', $("`n"+'$1')
1. First line
2. Second line
3. Third line
Run Code Online (Sandbox Code Playgroud)

作为替代方案,请使用双引号"并转义美元。就像这样,

$theString -replace '([2-9]\. )', "`n`$1"
1. First line
2. Second line
3. Third line
Run Code Online (Sandbox Code Playgroud)

另一种替代方案(感谢 Lieven)使用here-string。这里的字符串包含一个换行符。也许变量使它更容易使用。就像这样,

$repl = @'

$1
'@

$theString -replace '([2-9]\. )', $repl
1. First line
2. Second line
3. Third line
Run Code Online (Sandbox Code Playgroud)