Powershell正则表达式将下划线替换为连字符

时间:2020-08-28 12:18:46

标签: regex powershell

我试图找到一个powershell命令来搜索目录中的所有文件,并仅在相对链接中将所有下划线替换为连字符(链接不能以http开头)。

这里是一个例子:

<a href="/always_sunny/is_the_best/">

应该成为

<a href="/always-sunny/is-the-best/">

但是,我希望正则表达式忽略以http开头的href值。因此,应忽略此类链接。

<a href="http://thundergunexpress/always_sunny/"

以下是我正在使用的当前Powershell命令和正则表达式。此正则表达式似乎可以在Notepad ++中部分起作用,以查找和替换下划线,但不排除绝对链接。但是,正则表达式在powershell中根本无法运行,但是我不确定这是由于正则表达式还是我对Powershell的了解有限。非常感谢Powershell命令和正则表达式的帮助。

Get-ChildItem -Path k:\toolbox\powershell\ -recurse | ForEach {If (Get-Content $_.FullName | Select-String -Pattern '(\bhref="|(?!^)\G)[^"<_]*\K_'){(Get-Content $_ | ForEach {$_ -replace '(\bhref="|(?!^)\G)[^"<_]*\K_', '-'}) | Set-Content $_}}

1 个答案:

答案 0 :(得分:2)

注意,在匹配两个分隔符之间多次出现的模式时,PCRE与.NET regex不太相似。

.NET正则表达式中的“惯用”方法是使用非固定宽度的后向模式。在这里,您可以使用

(?<=\bhref="(?!http)[^"]*?)_(?=[^"]*")

请参见regex demo。详细信息:

  • (?<=\bhref="(?!http)[^"]*?)-向后正向匹配,该位置与紧跟在href="之后,而不是http之后,然后是{{1}以外的零个或多个字符的位置},尽可能少
  • "-一个_字符
  • _-紧跟着除(?=[^"]*")之外的零个或多个字符,然后是"个字符。
相关问题