Pergunta

Aqui é a entrada (html, não xml):

... html content ...
<tag1> content for tag 1 </tag1>
<tag2> content for tag 2 </tag2>
<tag3> content for tag 3 </tag3>
... html content ...

Gostaria de obter 3 jogos, cada um com dois grupos. Primeiro grupo deve conter o nome da marca eo segundo grupo conteria o texto interno do tag. Há apenas essas três tags, para que ele não precisa ser universal.

Em outras palavras:

match.Groups["name"] would be "tag1"
match.Groups["value"] would be "content for tag 2"

Todas as idéias?

Foi útil?

Solução

Eu não vejo por que você iria querer usar nomes de grupo de jogo para isso.

Aqui é uma expressão regular que corresponde ao nome de tag eo conteúdo tag em sub partidas numeradas.

<(tag1|tag2|tag3)>(.*?)</$1>

Aqui está uma variante com nomes de grupo estilo .NET

<(?'name'tag1|tag2|tag3)>(?'value'.*?)</\k'name'>.

Editar

RegEx adaptado conforme esclarecimentos pergunta do autor.

Outras dicas

Regex para isso poderia ser:

/<([^>]+)>([^<]+)<\/\1>/

Mas é geral, como eu não sei muito sobre o machanism escapar da NET. Traduzi-lo:

  • primeiro grupo corresponde o nome do primeiro tag entre
  • segundo grupo corresponde o conteúdo (de> para o próximo <
  • a verificação final, se o primeiro tag é fechada

HTH

Obrigado a todos, mas nenhuma das expressões regulares de trabalho. :( Talvez eu não era suficiente específica, desculpe por isso Aqui está o html exato eu estou tentando analisar:.

...some html content <b> etc </b> ...
<user> hello <b>mitch</b> </user>
...some html content <b> etc </b> ...
<message> some html <i>message</i> <a href....>bla</a> </message>
...some html content <b> etc </b> ...

Espero que seja mais claro agora. Eu estou atrás de usuário e MENSAGEM tags.

Eu preciso duas partidas, cada uma com dois grupos. Primeiro grupo wpould me dar o nome tag (usuário ou mensagem) eo segundo grupo me daria todo texto interno do tag.

É a dados xml adequada, ou será que basta olhar como ele?

Se é html, então o HTML agilidade pack vale investigação - este fornece uma DOM ( semelhante ao XmlDocument) que você pode usar para consultar os dados:

string input = @"<html>...some html content <b> etc </b> ...
<user> hello <b>mitch</b> </user>
...some html content <b> etc </b> ...
<message> some html <i>message</i> <a href....>bla</a> </message>
...some html content <b> etc </b> ...</html>";

            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(input);
            foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//user | //message"))
            {
                Console.WriteLine("{0}: {1}", node.Name, node.InnerText);
                // or node.InnerHtml to keep the formatting within the content
            }

Esta saídas:

user:  hello mitch
message:  some html message bla

Se você quiser as tags de formatação, em seguida, usar .innerHTML vez de .InnerText.

Se for xml, em seguida, para o código com o espectro completo de xml, seria melhor usar um analisador XML. Para xml tamanho pequeno a médio, carregá-lo em um DOM, como XmlDocument estaria bem - em seguida, consultar os nós (por exemplo, "// *"). Para enorme xml, XmlReader pode ser uma opção.

Se os dados não precisa se preocupar com o XML completo, em seguida, alguns regex simples não deve ser muito complicado ... um exemplo simplificado (sem atributos, sem namespaces, não xml aninhado) poderia ser:

string input = @"blah <tag1> content for tag 1 </tag1> blop
<tag2> content for tag 2 </tag2> bloop
<tag3> content for tag 3 </tag3> blip";

        const string pattern = @"<(\w+)>\s*([^<>]*)\s*</(\1)>";
        Console.WriteLine(Regex.IsMatch(input, pattern));
        foreach(Match match in Regex.Matches(input, pattern)) {
            Console.WriteLine("{0}: {1}", match.Groups[1], match.Groups[2]);
        }

O problema era que o ([^ <] *) as pessoas estavam usando para combinar as coisas dentro das tags foram combinando a abertura

Aqui está uma versão ligeiramente mais robusto de regex do Tomalak permitindo atributos e espaços em branco:

Regex tagRegex = new Regex(@"<\s*(?<tag>" + string.Join("|", tags) + @")[^>]*>(?<content>.*?)<\s*/\s*\k<tag>\s*>", RegexOptions.IgnoreCase);

Obviamente, se você está sempre apenas indo para necessidade de usar um conjunto específico de tags que você pode substituir o

string.Joing("|", tags)

com o tubo de codificada lista de etiquetas separados.

Limitações da regex são de que se você tiver um tag que você está tentando combinar aninhado em outro ele só irá coincidir com a tag exterior. i.

abc def ghi

Ele irá coincidir com a tag de usuário externo, mas não a tag mensagem interior.

Ele também não manipula> 's citado em atributos como assim:

Ele só irá corresponder

será uma parte do conteúdo tags.

Isto lhe dará grupos de captura nomeados para o que você quer. Não vai funcionar para marcas aninhadas, no entanto.

/<(?<name>[^>]+)>(?<value>[^<]+)</\1>/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top