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 № 1Você 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.
0 para resposta № 2
Duas versões alternativas:
(?<=test)("[^"]+")([^"])?
Caso você queira manter o resultado em um só lugar:
(?<=test)("[^"]+"[^"]?)