/ / C # grupo de captura Regex não está funcionando - c #, regex, grupo de captura, regex-group

C # grupo de captura Regex não está funcionando - c #, regex, grupo de captura, regex-grupo

No código a seguir, desejo capturar qualquer coisa que comece com teste e seja seguida pelo texto entre aspas duplas. Por exemplo.

test"abc"

test"rst"

O código funciona bem.

private void testRegex()
{
string st = "this test"abc"= or test"rst""uvw" or test(def)(abc) is a test.";
Regex oRegex = new Regex("test".*?"");

foreach (Match mt in oRegex.Matches(st))
{
Console.WriteLine(mt.Value);
}
}

Então, das capturas acima, eu quero capturaras subexpressões que seguem o teste da palavra (nos exemplos acima, essas subexpressões seriam "abc" e "first", incluindo o ". Eu tentei o seguinte e corretamente me dá:

"abc"

"rst"

private void testRegex()
{
string st = "this test"abc"= or test"rst""uvw" or test(def)(abc) is a test.";
Regex oRegex = new Regex("test(".*?")");

foreach (Match mt in oRegex.Matches(st))
{
Console.WriteLine(mt.Groups[1].Value);
}
}

Questão: Agora quero capturar as duas subexpressões 1. "abc" e "rst" 2. Qualquer caractere exceto "que segue o teste de partidas" abc "e testa" rst ". Então, eu tentei o seguinte, mas como mostrado abaixo, os grupos 1 e 2 para a partida" rst "" uvw "está errado. Eu preciso que o grupo 1 de" rst "" uvw "seja" rst "e que o grupo 2 esteja vazio, já que o caractere que segue" rst "é":

Grupo 1: "abc"

Grupo 2: =

Grupo 1: "primeiro"

Grupo 2: u

private void testRegex()
{
string st = "this test"abc"= or test"rst""uvw" or test(def)(abc) is a test.";
Regex oRegex = new Regex("test(".*?")([^"])");

foreach (Match mt in oRegex.Matches(st))
{
Console.WriteLine(mt.Groups[1].Value);
Console.WriteLine(mt.Groups[2].Value);
}
}

Respostas:

1 para resposta № 1

Você deve estar procurando

test("[^"]*")([^"])?

Vejo demonstração

Eu fiz 2 alterações:

  • Classe de personagem negada usada [^"]* (combinando 0 ou mais caracteres que não sejam aspas duplas) em vez de preguiçoso com qualquer caractere .*?
  • Fez o [^"] opcional com ? quantificador.

insira a descrição da imagem aqui


0 para resposta № 2

Duas versões alternativas:

(?<=test)("[^"]+")([^"])?

Caso você queira manter o resultado em um só lugar:

(?<=test)("[^"]+"[^"]?)