Grupos de Expressões Regulares em C #

Eu herdei um bloco de código que contém o seguinte regex e estou tentando entender como ele está obtendo seus resultados.

var pattern = @"\[(.*?)\]"; var matches = Regex.Matches(user, pattern); if (matches.Count > 0 && matches[0].Groups.Count > 1) ... 

Para o user == "Josh Smith [jsmith]" input user == "Josh Smith [jsmith]" :

 matches.Count == 1 matches[0].Value == "[jsmith]" 

… o que eu entendo Mas então:

 matches[0].Groups.Count == 2 matches[0].Groups[0].Value == "[jsmith]" matches[0].Groups[1].Value == "jsmith" <=== how? 

Olhando para esta pergunta pelo que entendi, a coleção do Google Groups armazena toda a partida, assim como a correspondência anterior. Mas, a regularidade acima não corresponde apenas a [colchete aberto] [texto] [fechar colchetes] então por que “jsmith” combinaria?

Além disso, é sempre assim que a coleção de grupos armazena exatamente 2 grupos: a partida toda e a última partida?

O ( ) atua como um grupo de captura. Portanto, a matriz de correspondências tem todas as correspondências que o C # localiza na sua cadeia de caracteres e a matriz secundária possui os valores dos grupos de captura dentro dessas correspondências. Se você não quiser que o nível extra de captura seja removido, remova o ( ) .

  • match.Groups[0] é sempre o mesmo que match.Value , que é todo o jogo.
  • match.Groups[1] é o primeiro grupo de captura em sua expressão regular.

Considere este exemplo:

 var pattern = @"\[(.*?)\](.*)"; var match = Regex.Match("ignored [john] John Johnson", pattern); 

Nesse caso,

  • match.Value é "[john] John Johnson"
  • match.Groups[0] é sempre o mesmo que match.Value , "[john] John Johnson" .
  • match.Groups[1] é o grupo de capturas do (.*?) .
  • match.Groups[2] é o grupo de capturas do (.*) .
  • match.Groups[1].Captures é outra dimensão.

Considere outro exemplo:

 var pattern = @"(\[.*?\])+"; var match = Regex.Match("[john][johnny]", pattern); 

Observe que estamos procurando por um ou mais nomes entre colchetes seguidos. Você precisa ser capaz de obter cada nome separadamente. Entre nas Captures !

  • match.Groups[0] é sempre o mesmo que match.Value , "[john][johnny]" .
  • match.Groups[1] é o grupo de capturas de (\[.*?\])+ . O mesmo que match.Value neste caso.
  • match.Groups[1].Captures[0] é o mesmo que match.Groups[1].Value
  • match.Groups[1].Captures[1] é [john]
  • match.Groups[1].Captures[2] é [johnny]

Os parênteses também identificam um grupo, portanto, a correspondência 1 é a correspondência completa e a correspondência 2 é o conteúdo do que foi encontrado entre os colchetes.

Como? A resposta está aqui

 (.*?) 

Isso é um subgrupo de @ “[(. *?)];

Grupos [0] – é toda a sua string de input Grupos [1] é seu grupo capturado por parênteses (.*?) Você pode configurar o Regex para capturar apenas grupos explícitos (existe uma opção para isso quando você cria um regex), ou usar (?:.*?) para criar um grupo sem captura.