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

3
我会尽力为您翻译。以下是需要翻译的内容:

我正在尝试查找一条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个回答

1
请注意,当涉及在两个定界符之间匹配某些模式的多个出现时,PCRE与.NET正则表达式并不相似。
在.NET正则表达式中,实现这一点的“惯用”方法是使用非固定宽度的lookbehind模式。在这里,您可以使用。
(?<=\bhref="(?!http)[^"]*?)_(?=[^"]*")

请看正则表达式演示。细节:
  • (?<=\bhref="(?!http)[^"]*?) - 正向后瞻,匹配紧跟着href="的位置,不跟随http,然后是零个或多个非"字符,尽可能少。
  • _ - 一个_字符
  • (?=[^"]*") - 紧接着零个或多个非"字符,然后是一个"字符。

我注意到一个问题,希望你能帮我解决。有没有办法只针对位于<a>标签内的href属性进行定位?目前这会定位到任何地方的href标签(例如在<script>标签中)。谢谢! - Brian
@Brian (?<=<a(?:\s[^<>]*?)?\bhref="(?!http)[^"]*?)_(?=[^"]*") will do - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接