complex-在Powershell c#中用Regex替换

本文关键字:Regex 替换 中用 Powershell complex- | 更新日期: 2023-09-27 18:23:46

以下Regex:

(?<=href('s+)?=('s+)?")(?!('s+)?http)(?!//).+(?=")

与试验品一样有效:

href="//www.google-analytics.com/analytics.js">
href="https://www.google-analytics.com/analytics.js">
href="index.html">
href="..'index.html">
href="main.css">
href="..'assets'main.css">
href = " ..'assets'main.css ">

正如您在这里看到的:https://t.co/PC0U9br3vn

但是:

[$string] $string = Get-Content sample.txt
[$string] $regex = '(?<=href('s+)?=('s+)?")(?!('s+)?http)(?!('s+)?//)(?!('s+)?mailto).+(?=")'
$newString = $string -replace $regex, "..'$&"
$string
$newString

产生以下输出:

//www.google-analytics.com/analytics.js">  href=" https://www.google-analytics.com/analytics.js">  href="index.html">  href="..'index.html">  href="  main.css">  href="..'assets'main.css">  href = " ..'assets'main.css ">  href = "mailto://email@domain ">  href = "..'..'..'assets'main.css"
//www.google-analytics.com/analytics.js">  href=" https://www.google-analytics.com/analytics.js">  href="..'index.html">  href="..'index.html">  href="  main.css">  href="..'assets'main.css">  href = " ..'assets'main.css ">  href = "mailto://email@domain ">  href = "..'..'..'assets'main.css"

由于只有第一篇文章正在操作。

在替换字符串不使用regex并且是一个简单字符串的其他地方,也可以使用相同的脚本。

complex-在Powershell c#中用Regex替换

输入类型错误:

[$string] $string = Get-Content sample.txt

然而,字符串数组有效:

[$string[]] $string = Get-Content sample.txt

您只需要一个否定字符类[^"]+(请参阅我的这篇文章,我在其中解释了'[^"']+的工作原理)。然而,也要注意,('s+)?'s*相同。如果您不打算使用捕获组,则无需在regex中添加过多的捕获组。

使用

(?<=href's*='s*")(?!'s*http)(?!//)[^"]+

参见regex演示

以下是它匹配的内容:

  • (?<=href's*='s*")-如果href后面跟着0个或多个空白符号,后面跟着=,然后在…之前再加0个或更多空白
  • (?!'s*http)-如果当前位置后面没有0或更多的空白,后面紧跟着http,并且
  • (?!//)-如果当前位置后没有//
  • [^"]+-匹配除"之外的1个或多个字符