我想在Powershell中使用这个正则表达式,它使用gis标志,
https://regex101.com/r/yoM4cV/1
/(?<=#start)(.+)(?=#end)/gis匹配#开始和#结束之间的句子
#start
hello powershell regex
what is the equivalent of flags gis
#end我找不到任何支持Powershell的gis标志的信息。这个在Powershell里不见了吗?如果是的话,还有别的选择吗?
更新:我之所以这样问是因为这会返回false。
$test=@'
#start
hello powershell regex
what is the equivalent of flags gis
#end
'@
$test -match (?<=#start)(.+)(?=#end)发布于 2022-05-22 14:44:09
要修复您的示例,您需要这样编写:
$test -match '(?s)(?<=#start)(.+)(?=#end)'(?s),允许.在多行上进行匹配.()是PowerShell分组操作符,在您的示例中,该操作符使PowerShell尝试将正则表达式模式解释为PowerShell表达式,而PowerShell表达式不起作用。相反,将其作为文字字符串传递给-match。详细说明:
从(case-insensitive)中,只有i gis和s (single-line)可以作为标志在PowerShell中使用(或者在.NET中更一般,因为PowerShell在幕后使用.NET RegEx支持)。
您可以在模式开始时将它们指定为内联标志 .
(?is)(?<=#start)(.+)(?=#end)..。或者使用Regex类的Regex参数,它接受RegExOptions参数:
$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,因此它只找到一个匹配项)。
$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
}输出:
----- Match -----
hello powershell regex
what is the equivalent of flags gis
----- Match -----
foobar发布于 2022-05-22 14:19:49
PowerShell中的正则表达式是用字符串定义的,而不是正则文本(像action/pattern/flags这样的结构)。
g标志不是作为regex选项在PowerShell中实现的,您需要使用多个匹配。如果使用Select-String,则需要-AllMatches选项来匹配所有事件。如果使用.NET regex,.NET可以使用查找所有事件的Regex.Matches方法。
i和s标志的使用比较简单,您可以使用它们作为内联修饰符、(?s)、(?i)或以(?si)形式连接,您可以将它们放在模式的开头,这样它们就可以影响整个模式(或者将它们放置在模式的任何地方),从而影响所有模式的右边(并且可以用s禁用它们)。
如果定义regex对象,则可以使用[Text.RegularExpressions.RegexOptions]'Singleline'、[Text.RegularExpressions.RegexOptions]'IgnoreCase'或[Text.RegularExpressions.RegexOptions]'IgnoreCase, Singleline'。
当您需要使用s标志时,您必须确保输入被视为一个多行字符串。如果您在其中读取文件,则需要确保将-Raw选项与Get-Content一起使用。
下面是gis标志“转换”在PowerShell中的一个示例:
$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输出:
hello powershell regex
what is the equivalent of flags gis同样的结果可以在
($test | Select-String -Pattern '(?si)(?<=#start)(.*?)(?=#end)' -AllMatches).Matches.Valuehttps://stackoverflow.com/questions/72338276
复制相似问题