regex 我在PowerShell中使用此正则表达式时有什么问题?

bttbmeg0  于 2023-04-07  发布在  Shell
关注(0)|答案(2)|浏览(70)

我正在尝试使用以下代码在PowerShell中使用正则表达式抓取网页:

$webClient = New-Object System.Net.WebClient
$data = $webClient.downloadstring($url)
$h1Tag = [regex] '(?i)(?<=<h1 class="mb-0 mb-lg-1 svelte-jcq9ad">)([\S\s]*?)(?=<\/h1>)'
$h1 = $h1Tag.Match($data).value.trim()

要搜索的示例文本:

<div>
     <h1 class="mb-0 mb-lg-1 svelte-jcq9ad">AdBlock — best ad blocker</h1>
     <h2 class="mb-2 svelte-jcq9ad">Block ads and pop-ups on YouTube, Facebook, Twitch, and your favorite websites.</h2>
  </div>
</div>

当我在几个正则表达式测试网站上测试正则表达式时,它正确地返回AdBlock - best ad blocker,但在PowerShell中$h1总是空的。我错过了什么?
编辑:我在我的问题中将$title更新为$h1。$title是我的一个错字- $h1是我应该说的。

wf82jlnq

wf82jlnq1#

试试这个:

$data = '<div>
     <h1 class="mb-0 mb-lg-1 svelte-jcq9ad">AdBlock — best ad blocker</h1>
     <h2 class="mb-2 svelte-jcq9ad">Block ads and pop-ups on YouTube, Facebook, Twitch, and your favorite websites.</h2>
  </div>
</div>'

$null = $data -match("AdBlock — best ad blocker")
$h1 = $Matches.Values
a0x5cqrl

a0x5cqrl2#

先说重要的事

  • 如果可能的话,最好使用一个专用的HTML解析器,这可以实现比基于regex的解决方案更健壮的解决方案,而基于regex的解决方案总是很脆弱-请参阅iRon对这个问题的评论。

如前所述,你的正则表达式 does 与你的样例输入一起工作,这意味着样例输入并不能代表你的实际问题。
下面的代码 * 可能 * 解决了你的问题,因为它使用了更灵活的正则表达式,并且它还展示了在PowerShell中执行单个正则表达式匹配的惯用方法,使用**-match运算符**:

$data = '<div>
     <h1 class="mb-0 mb-lg-1 svelte-jcq9ad">AdBlock — best ad blocker</h1>
     <h2 class="mb-2 svelte-jcq9ad">Block ads and pop-ups on YouTube, Facebook, Twitch, and your favorite websites.</h2>
  </div>
</div>'

$h1 = 
  if ($data -match '(?s)(?<=<h1\s+class=[''"]mb-0\s+mb-lg-1\s+svelte-jcq9ad[''"]\s*>)(.*?)(?=</\s*h1>)') {
    # Output the trimmed form of the match, which is stored in entry 0
    # of the automatic $Matches variable.
    $Matches[0].Trim()
  }

# Output the result.
$h1

注意事项:

  • -match是大小写不敏感的 * 默认情况下 所有 * 文本相关的PowerShell运算符也是如此),因此不需要(?i)内联选项。
  • 然而,添加了内联选项(?s),以便允许.也匹配 newlines,从而避免了[\s\S]解决方案的需要。
  • /在PowerShell中永远不需要转义(如\/),因为正则表达式被指定为普通的 * 字符串字面量 *(其中/没有特殊含义)。
  • 正则表达式在空格方面变得更加灵活(强制性空格表示为\s+,可选空格表示为\s*,以及引号字符('"都匹配)。
  • 有关详细的解释和使用正则表达式的能力,请参见this regex101.com page

注意:链接的页面使用C#字符串语法,但字符串内容与上面的相同(PowerShell和C#都使用.NET正则表达式引擎)。

相关问题