4

我在 Powershell 中使用正则表达式。我有一个非捕获组,但它仍然显示在我的结果中。

字符串是:

Grid1.Data = [['TRE - Significant Flux','EG Report','w939909','59e8a31f-d9e9-4ebf-a027-929ec62953ac'],['CB - Daily OD Report','EG Report','w9
39909','59e8a31f-d9e9-4ebf-a027-929ec62953ac'],['BC - Balance Transfers Daily - DRAFT','BC - Balance Transfers Daily - DRAFT','w939909','59e8
a31f-d9e9-4ebf-a027-929ec62953ac'],['CB - CL Activity Report','CB - CL Activity Report','w939909','59e8a31f-d9e9-4ebf-a027-929ec62953ac']]

正则表达式是:

$regex = "(?:\[').*?(?=')"  

它仍在返回类似 ['TRE - 重要通量

我需要排除开头的“['”。单引号末尾的非捕获组正在工作。

4

2 回答 2

5

尝试使用后向断言

$regex = "(?<=\[').*?(?=')"

或者:

$regex = "(?:\[\[')(.*?)(?=')"

$yourstring -match $regex

$Matches[1]
于 2013-02-13T20:45:40.027 回答
1

非捕获组(?:\[')仍然包含在表达式的“匹配”部分中,因此在“匹配”中返回。Lookaheads(例如 (?='))和lookbehinds 不是匹配的部分,而是布尔断言(如锚 ^ 和 $)。它们的模式必须从当前字符串位置向前(向前看)或向后(向后看)匹配(正向查看)或不匹配(负向查看),但它们仅返回真或假,并且不推进匹配指针。术语“非捕获”是指使用括号来“捕获”整体匹配的可单独检索的子部分(块)以及对模式的部分进行分组,通常当量词(*、+、?)应用于其他情况时未分组的部分,例如由 | 分隔的部分。一个“非捕获”组( (?:

请注意,@CB 的答案中给出的第二个例子并不是最小的。由于要求是在 [ 之后立即检索两个 ' 字符之间的文本,并且最终的 ' 将被丢弃(后续匹配不需要),因此使用捕获组意味着将 [ 和两个 ' 字符包含在主匹配无关紧要。因此模式可以是

$regex = "\['(.*?)'"
于 2020-08-07T04:52:04.833 回答