【问题标题】:Regex - Non capturing group not working正则表达式 - 非捕获组不起作用
【发布时间】:2020-08-07 13:05:03
【问题描述】:

我在 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 - 重要通量

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

【问题讨论】:

  • 如果powershell支持,可以使用look-behind
  • 您的正则表达式有一些错误,[ 没有转义。
  • 用\(?:\[')转义

标签: regex powershell powershell-2.0


【解决方案1】:

尝试使用后向断言

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

或:

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

$yourstring -match $regex

$Matches[1]

【讨论】:

  • 谢谢。这样可行。不能说我完全明白,但它有效。
  • @user1921849 很高兴为您提供帮助!阅读此处asiteaboutnothing.net/regex/regex-lookarounds.html 进行回顾
  • 第二个表达式不等于第一个。第一个表达式匹配每个 [ ] 子块中的第一个带引号的字符串,但第二个(带有 \[\[ )仅匹配第一个 [ ] 子块。虽然两个表达式在与-match 一起使用时都只会返回第一个 [ ] 子块,但使用 ([regex]$regex).Matches($yourstring) 会返回第一个表达式的所有匹配项。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 2011-02-11
    • 2015-10-16
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多