首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell regex gis标志支持

Powershell regex gis标志支持
EN

Stack Overflow用户
提问于 2022-05-22 14:00:50
回答 2查看 266关注 0票数 2

我想在Powershell中使用这个正则表达式,它使用gis标志,

https://regex101.com/r/yoM4cV/1

代码语言:javascript
复制
/(?<=#start)(.+)(?=#end)/gis

匹配#开始和#结束之间的句子

代码语言:javascript
复制
  #start
  hello powershell regex
  what is the equivalent of flags gis
  #end

我找不到任何支持Powershell的gis标志的信息。这个在Powershell里不见了吗?如果是的话,还有别的选择吗?

更新:我之所以这样问是因为这会返回false。

代码语言:javascript
复制
  $test=@'
  #start
  hello powershell regex
  what is the equivalent of flags gis
  #end
  '@

  $test -match (?<=#start)(.+)(?=#end)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-22 14:44:09

要修复您的示例,您需要这样编写:

代码语言:javascript
复制
$test -match '(?s)(?<=#start)(.+)(?=#end)'
  • 启用单行模式(?s),允许.在多行上进行匹配.
  • 引用正则表达式,因为()是PowerShell分组操作符,在您的示例中,该操作符使PowerShell尝试将正则表达式模式解释为PowerShell表达式,而PowerShell表达式不起作用。相反,将其作为文字字符串传递给-match

详细说明:

从(case-insensitive)中,只有i giss (single-line)可以作为标志在PowerShell中使用(或者在.NET中更一般,因为PowerShell在幕后使用.NET RegEx支持)。

您可以在模式开始时将它们指定为内联标志 .

代码语言:javascript
复制
(?is)(?<=#start)(.+)(?=#end)

..。或者使用Regex类的Regex参数,它接受RegExOptions参数:

代码语言:javascript
复制
$options = [System.Text.RegularExpressions.RegexOptions] 'IgnoreCase, Singleline'
[Regex]::Match('text', 'pattern', $options)

g (全局)标志不可直接使用。您可以通过调用[Regex]::Matches()方法来有效地使用它,该方法查找所有匹配项(与[Regex]::Match()相反,也与-match操作符相反,后者只找到第一个匹配项)。它的输出是已找到的所有匹配的集合。

或者,您可以将Select-String与参数-AllMatches一起使用,就像Wiktor Stribiżew的回答演示的那样。

为了演示起见,我对示例做了一些修改,使其实际上找到多个匹配项(原始RegEx将第一个#start之间的所有内容匹配到最后一个#end,因此它只找到一个匹配项)。

代码语言:javascript
复制
$text = @'
#start
hello powershell regex
what is the equivalent of flags gis
#end
#start
foobar
#end
'@

$pattern = '(?is)(?<=#start)(.+?)(?=#end)'

foreach( $match in [Regex]::Matches($text, $pattern) ) {
    '----- Match -----'
    $match.Groups[1].Value   # Output the captured value of the 1st group
}

输出:

代码语言:javascript
复制
----- Match -----

hello powershell regex
what is the equivalent of flags gis

----- Match -----

foobar
票数 4
EN

Stack Overflow用户

发布于 2022-05-22 14:19:49

PowerShell中的正则表达式是用字符串定义的,而不是正则文本(像action/pattern/flags这样的结构)。

g标志不是作为regex选项在PowerShell中实现的,您需要使用多个匹配。如果使用Select-String,则需要-AllMatches选项来匹配所有事件。如果使用.NET regex,.NET可以使用查找所有事件的Regex.Matches方法。

is标志的使用比较简单,您可以使用它们作为内联修饰符、(?s)(?i)或以(?si)形式连接,您可以将它们放在模式的开头,这样它们就可以影响整个模式(或者将它们放置在模式的任何地方),从而影响所有模式的右边(并且可以用s禁用它们)。

如果定义regex对象,则可以使用[Text.RegularExpressions.RegexOptions]'Singleline'[Text.RegularExpressions.RegexOptions]'IgnoreCase'[Text.RegularExpressions.RegexOptions]'IgnoreCase, Singleline'

当您需要使用s标志时,您必须确保输入被视为一个多行字符串。如果您在其中读取文件,则需要确保将-Raw选项与Get-Content一起使用。

下面是gis标志“转换”在PowerShell中的一个示例:

代码语言:javascript
复制
$rx = [System.Text.RegularExpressions.Regex]::new('(?<=#start)(.*?)(?=#end)', [Text.RegularExpressions.RegexOptions]'IgnoreCase, Singleline')
$test=@'
   #start
   hello powershell regex
   what is the equivalent of flags gis
   #end
'@
$rx.Matches($test).value

输出:

代码语言:javascript
复制
  hello powershell regex
  what is the equivalent of flags gis

同样的结果可以在

代码语言:javascript
复制
($test | Select-String -Pattern '(?si)(?<=#start)(.*?)(?=#end)' -AllMatches).Matches.Value
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72338276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档