Corresponde não capturada ao usar o '- SimpleMatch ' com o Select-String
tenho usado a expressão regular para processar o texto dentro de alguns nós XML. No entanto, quando eu uso -SimpleMatch
com Select-String
, O Objeto MatchInfo não parece conter nenhuma correspondência.
usando um exemplo muito simples, podemos devolver o objeto MatchInfo esperado ao usar a expressão regular patterning:
PS H:\> $c = "abd 14e 568" | Select-String -Pattern "ab"
PS H:\> $c.Matches
Groups : {ab}
Success : True
Captures : {ab}
Index : 0
Length : 2
Value : ab
mas a adição do parâmetro -SimpleMatch
parece não devolver a propriedade correspondente no objecto MatchInfo:
PS H:\> $c = "abd 14e 568" | Select-String -Pattern "ab" -SimpleMatch
PS H:\> $c.Matches
PS H:\>
Piping $c
to Get-Member
confirma que um objecto MatchInfo foi devolvido:
PS H:\> $c | gm
TypeName: Microsoft.PowerShell.Commands.MatchInfo
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
RelativePath Method string RelativePath(string directory)
ToString Method string ToString(), string ToString(string directory)
Context Property Microsoft.PowerShell.Commands.MatchInfoContext Context {get;set;}
Filename Property string Filename {get;}
IgnoreCase Property bool IgnoreCase {get;set;}
Line Property string Line {get;set;}
LineNumber Property int LineNumber {get;set;}
Matches Property System.Text.RegularExpressions.Match[] Matches {get;set;}
Path Property string Path {get;set;}
Pattern Property string Pattern {get;set;}
e outras propriedades, tais como padrões e trabalhos em Linha:
PS H:\> $c.Pattern
ab
PS H:\> $c.Line
abd 14e 568
além disso, não é gerado nenhum erro ao enviar um valor de índice para a matriz de correspondências:
PS H:\> $c.Matches[0]
PS H:\>
Não sei como interpretar os resultados, nem sei porque é que é ocorrer.
Este comportamento é problemático, pois há muitas vezes que devo procurar por cadeias que contêm caracteres especiais regex, () ' s são muito comuns.
Expansion on the example:
PS H:\> $c = "ab(d) 14e 568" | Select-String -Pattern "ab(d)"
PS H:\> $c.Matches
PS H:\>
$c.Matches
não devolve nada, e o $c
em si é nulo, devido ao uso dos parêntesis no padrão regex:
PS H:\> $c -eq $null
True
o uso de -SimpleMatch
produz um objecto MatchInfo, mas ainda assim não devolve nenhuma correspondência:
PS H:\> $c = "ab(d) 14e 568" | Select-String -Pattern "ab(d)" -SimpleMatch
PS H:\> $c -eq $null
False
PS H:\> $c.Matches
PS H:\>
o trabalho que encontrei (aqui em SO) é para usa a Regex.Método de fuga de .NET:
(referência: O select-string Powershell falha devido à sequência de escape)
PS H:\> $pattern = "ab(d)"
$pattern = ([regex]::Escape($pattern))
$c = "ab(d) 14e 568" | Select-String -Pattern $pattern
PS H:\> $c.Matches
Groups : {ab(d)}
Success : True
Captures : {ab(d)}
Index : 0
Length : 5
Value : ab(d)
à medida que este trabalho retorna as correspondências esperadas de Select-String
, eu fui capaz de continuar o meu scripting.
mas estou curioso por saber porque é que não são devolvidos fósforos ao usar o parâmetro -SimpleMatch
.
...
Com respeito,
Schwert
1 answers
De Get-Help Select-String -Parameter SimpleMatch
:
-SimpleMatch [
<SwitchParameter>
]Usa uma correspondência simples em vez de uma correspondência de expressão regular. Em uma correspondência simples, Select-String procura a entrada para o texto no parâmetro padrão. não interpreta o valor do parâmetro padrão como uma declaração de expressão regular.
Então, SimpleMatch
simplesmente faz uma busca em substring de $Pattern
dentro de cada string que você encaminha para ele. Devolve um objecto MatchInfo
que contém o texto e é relevante informação contextual se presente, mas não Matches
uma vez que uma correspondência regular adequada nunca foi realizada contra a cadeia de caracteres - é tão simples como isso