Regex: Para retirar um sub-corda entre duas marcas em uma string

votos
42

Eu tenho um arquivo no seguinte formato:

dados dados
Dados
[Começar]
Os dados que eu quero
[Fim]
Dados

Eu gostaria de agarrar a Data I wantpartir de entre as [Start]e [End]tags usando um Regex. Alguém pode me mostrar como isso pode ser feito?

Publicado 04/08/2008 em 14:47
fonte usuário
Em outras línguas...                            


9 respostas

votos
63
\[start\](.*?)\[end\]

Zhich'll colocar o texto no meio dentro de uma captura.

Respondeu 04/08/2008 em 14:52
fonte usuário

votos
22

\[start\]\s*(((?!\[start\]|\[end\]).)+)\s*\[end\]

Este deve esperamos largar o [start]e [end]marcadores também.

Respondeu 04/08/2008 em 14:55
fonte usuário

votos
5
$text ="Data Data Data start Data i want end Data";
($content) = $text =~ m/ start (.*) end /;
print $content;

Eu tive um problema semelhante durante algum tempo e posso dizer-lhe este método funciona ...

Respondeu 06/10/2012 em 17:52
fonte usuário

votos
4

Enquanto você pode usar uma expressão regular para analisar os dados entre abertura e fechamento, é preciso pensar muito para saber se este é um caminho que você quer ir para baixo. A razão para isso é o potencial de marcas para ninho: se as tags de nidificação poderia acontecer ou pode acontecer, a linguagem é dito para não ser mais regular, e expressões regulares deixará de ser a ferramenta adequada para analisá-lo.

Muitas implementações de expressões regulares, como PCRE ou expressões regulares do Perl, recuo de apoio que pode ser usado para conseguir esse efeito áspera. Mas PCRE (ao contrário de perl) não suporta retrocesso ilimitada, e isso pode realmente causar coisas para quebrar em formas estranhas, logo que você tem muitas tags.

Há um post muito comumente citados blog que discute isso mais, http://kore-nordmann.de/blog/do_NOT_parse_using_regexp.html (google para ele e verificar o cache atualmente, eles parecem estar a ter algum tempo de inatividade)

Respondeu 15/09/2008 em 15:18
fonte usuário

votos
4

Uma discussão mais completa das armadilhas de usar um regex para encontrar etiquetas correspondentes podem ser encontradas em: http://faq.perl.org/perlfaq4.html#How_do_I_find_matchi . Em particular, estar ciente de que as tags de nidificação realmente precisa de um analisador de pleno direito, a fim de ser interpretados corretamente.

Note-se que a sensibilidade caso terá de ser desligada, a fim de responder à pergunta como indicado. Em perl, isso é o i modificador:

$ echo "Data Data Data [Start] Data i want [End] Data" \
  | perl -ne '/\[start\](.*?)\[end\]/i; print "$1\n"'
 Data i want 

O outro truque é usar o *? quantificador que desliga a ganância do jogo capturado. Por exemplo, se você tem um não-correspondência [final] tag:

Data Data [Start] Data i want [End] Data [end]

você provavelmente não deseja capturar:

 Data i want [End] Data
Respondeu 20/08/2008 em 20:14
fonte usuário

votos
3

Bem, se você garantir que cada marca de início é seguida por uma tag final, em seguida, o seguinte iria funcionar.

\[start\](.*?)\[end\]

No entanto, se você tem textos complexos, como o follwoing:

[start] sometext [start] sometext2 [end] sometext [end]

então você tiver problemas com o regex.

Agora exemplo a seguir vai retirar todos os hot links em uma página:

'/<a(.*?)a>/i'

No caso acima, podemos garantir que não haveria quaisquer casos aninhados de:

'<a></a>'

Então, essa é uma questão complexa e não pode apenas ser resolvido com uma resposta simples.

Respondeu 11/05/2009 em 21:08
fonte usuário

votos
1

Com Perl você pode cercar os dados que deseja com () 's e retire-o mais tarde, talvez outras línguas têm uma característica similar.

if ($s_output =~ /(data data data data START(data data data)END (data data)/) 
{
    $dataAllOfIt = $1;      # 1 full string
    $dataInMiddle = $2;     # 2 Middle Data
    $dataAtEnd = $3;        # 3 End Data
}
Respondeu 04/08/2008 em 15:00
fonte usuário

votos
0

Lendo o texto com nos colchetes [] ou seja, [Iniciar] e [End] e validar a matriz com uma lista de valores. jsFiddle http://jsfiddle.net/muralinarisetty/r4s4wxj4/1/

var mergeFields = ["[sitename]",
                   "[daystoholdquote]",
                   "[expires]",
                   "[firstname]",
                   "[lastname]",
                   "[sitephonenumber]",
                   "[hoh_firstname]",
                   "[hoh_lastname]"];       

var str = "fee [sitename] [firstname] \
sdfasd [lastname] ";
var res = validateMeargeFileds(str);
console.log(res);

function validateMeargeFileds(input) {
    var re = /\[\w+]/ig;
    var isValid;
    var myArray = input.match(re);

    try{
        if (myArray.length > 0) {
            myArray.forEach(function (field) {

                isValid = isMergeField(field);

                if (!isValid){
                   throw e;                        
                }
            });
        }
    }
    catch(e) {        
    }

    return isValid;
}

function isMergeField(mergefield) {
    return mergeFields.indexOf(mergefield.toLowerCase()) > -1;
}
Respondeu 12/09/2014 em 09:26
fonte usuário

votos
0

Consulte esta questão para retirar texto entre tags com caracteres de espaço e pontos ( .)

[\S\s] é o que eu usei

Regex para corresponder a qualquer caractere, incluindo novas linhas

Respondeu 28/08/2013 em 22:12
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more