我想在使用 gis 標志的 Powershell 中使用這個正則運算式,
https://regex101.com/r/yoM4cV/1
/(?<=#start)(. )(?=#end)/gis
匹配#start和#end之間的句子
#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)
uj5u.com熱心網友回復:
PowerShell 中的正則運算式是用字串字面量定義的,而不是正則運算式字面量(類似 的結構action/pattern/flags)。
該g標志未在 PowerShell 中作為正則運算式選項實作,您需要使用多重匹配。如果您使用Select-String,您將需要-AllMatches匹配所有匹配項的選項。如果您使用 .NET 正則運算式 API,ypu 可以使用Regex.Matches查找所有匹配項的方法。
iand標志的s用法更簡單,您可以將它們用作行內修飾符,, (?s),(?i)或加入,(?si)因為您可以將它們放置在模式的開頭,以便它們可以影響整個模式(或將它們放置在模式中的任何位置,以便影響它們右側的所有模式(您可以使用(?-s)/ (?-i)/禁用它們(?-si))。
如果您定義一個正則運算式物件,您可以使用[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.Value
uj5u.com熱心網友回復:
要修復您的示例,您需要這樣撰寫:
$test -match '(?s)(?<=#start)(. )(?=#end)'
- 啟用單行模式
(?s)以允許.匹配多行。 - 參考正則運算式
()是因為 PowerShell 分組運算子在您的示例中使 PowerShell 嘗試將正則運算式模式解釋為 PowerShell 運算式,這不起作用。相反,將其作為文字字串傳遞給-match.
詳細解釋:
From gis,只有i( case-insensitive ) 和s( single-line ) 可用作 PowerShell 中的標志(或更一般地在 .NET 中,因為 PowerShell 在后臺使用 .NET RegEx 支持)。
您可以將它們指定為模式開頭的行內標志...
(?is)(?<=#start)(. )(?=#end)
...或通過使用接受options引數的Regex類的RegExOptions引數:
$options = [System.Text.RegularExpressions.RegexOptions] 'IgnoreCase, Singleline'
[Regex]::Match('text', 'pattern', $options)
( globalg )標志不是直接可用的。您可以通過呼叫查找所有匹配項的方法來有效地使用它(與僅查找第一個匹配項的運算子相反)。它的輸出是已找到的所有匹配項的集合。[Regex]::Matches()[Regex]::Match()-match
或者,您可以使用Select-Stringwith parameter -AllMatches,正如Wiktor Stribi?ew 的有用答案所示。
出于演示目的,我稍微修改了您的示例,以便它實際上找到多個匹配項(您的原始 RegEx 匹配 first#start到 last之間的所有內容#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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479769.html
上一篇:推特用戶名的正則運算式
