Regular expressions

10 respostas
Bruno_Cardoso

Boas,

pessoal, queria transformar a seguinte string (por exemplo) :

[zode]while(rs.next()) { pb = new PostBean(); pb.setId(rs.getInt("rep_Id")); pb.setName(rs.getString("rep_Name")); }[/zode]

em:

<zable>while(rs.next()) { pb = new PostBean(); pb.setId(rs.getInt("rep_Id")); pb.setName(rs.getString("rep_Name")); }</zable>

Experimentei fazer:

string.replaceAll("\[code\](.*)\[/code\]", "<zable>$1</zable>")

mas não funcionou, penso q é por causa de todos aquelas caracteres especiais: {}=":_ etc etc… alguem sabe como representa-los numa expressao regular?

Obrigado

10 Respostas

marciolx

faz assim:

(no seu exemplo de texto você usou zode com z, mas na sua expressão você usou code com c, vou supor que o correto é zode com z)

String y = x.replaceAll("\[zode]((.|\s)*?)\[/zode]", "<zable>$1</zable>");

ATENÇÃO: ONDE VOCÊ ESTIVER VENDO UM BARRA INVERTIDA COLOQUE DUAS

não se esqueça de que replaceAll retorna uma nova String e não modifica a original

PS.: Lá em Valhalla também passam aqueles perueiros que para e gritam no seu ouvido no ponto de ônibus: - MONTE OLIMPO!!!, CÉU!!!, INFEEEERNOO!!! ?

Bruno_Cardoso

Funcionou às mil maravilhas… era esta parte que eu estava a precisar:

((.|\s)*?)

Já agora se não custar muito pode-me explicar o q isto significa? para eu entender melhor…

Só há mais um problema… é q ele coloca tudo seguido na mesma linha… sabe como posso dar a voltar a isto? Talvez substituindo o caracter de final de linha por um
? como represento o caracter de final de linha nas expressoes regulares, sabe?

Obrigado pela ajuda!

louds

Esse trecho ta cheio de redundancias e tem 1 erro.
O escape ‘s’ não existe, vc que queria dizer ‘\s’? Em vez de usar ‘.|\s’ é melhor passar a flag DOTALL pro Pattern.
usar ‘()?’ é redundante, '’ implica em 0 ou mais ocorrencias, ‘?’ implica em 0 ou 1 ocorrencias. A propria documentação da Sun classifica *? como redundante.

marciolx

1 - o s está com a barra no post original, é no quote que saiu sem barras
2 - vc tem razão, o *? é redundante
3 - vc tem razão também quanto ao DOTALL
4 - não sou nenhum mago das strings :slight_smile:
5 - Não gritem PINHEIROS, LAAAAPA, VILA MADALEEEENAAA no meu ouvido que eu não sou surdo :?

Bruno_Cardoso

uma pergunta final… como é que eu colocava caso eu quisesse fazer a mesma coisa q fiz em cima mas em que a parte do meio entre as tags NÃO PUDESSE conter a string [/zode] por exemplo… alguem sabe?

Obrigado

marciolx

em primeiro lugar troque o redundante *? por * ambos querem dizer a mesma coisa que é “onde a expressão aparece 0 ou mais vezes”

os dois parênteses (( )) significam que a expressão tem dois grupos de captura que é o que é retornado por $n (onde n=1…n)

o | é uma condicional OR

o . significa qualquer caracter e o s significa qualquer espaço em branco incluindo tabulação ou terminador de linha.

Juntando tudo:

pegue qualquer caractere OU terminador de linha que ocorram 0 ou mais vezes entre as palavras e

Bruno_Cardoso
"marciolx":
em primeiro lugar troque o redundante *? por * ambos querem dizer a mesma coisa que é "onde a expressão aparece 0 ou mais vezes"

Ja fiz isso :)

"marciolx":
Juntando tudo:

pegue qualquer caractere OU terminador de linha que ocorram 0 ou mais vezes entre as palavras [zode] e [/zode]

Poix... o problema é q se eu tiver por exemplo:

[zode]sdfsdfsdf[/zode][zode]sdgsg[/zode]

Ele pega no 1º [zode] e no ultimo [/zode] e faz apenas uma transformacao em vez de reconhecer as duas...
marciolx
"Morcego":
Poix... o problema é q se eu tiver por exemplo:
[zode]sdfsdfsdf[/zode][zode]sdgsg[/zode]

Ele pega no 1º [zode] e no ultimo [/zode] e faz apenas uma transformacao em vez de reconhecer as duas...

bom, daí é só você dizer para a expressão regular que você não quer o caminho mais longo entre os dois pontos (greedy regex) e sim todos os caminhos (non-greedy regex), ou seja, é só voltar a acrescentar o "redundante" *? e problema resolvido

Bruno_Cardoso

muhahhahhahaha :smiley: funcionou!! bem… não sei se vc é o mago das strings mas se não é anda lá perto! :stuck_out_tongue: Obrigadão!

marciolx

ok :smiley: para mais informações veja a documentação da API java.util.regex, tem muita coisa lá ou procure por “regular expressions” no google, é um assunto bem interessante. No meu caso eu sempre acrescento um “-perl” na busca, porque se eu quisesse ler hieróglifos seria arqueólogo.

Criado 16 de agosto de 2003
Ultima resposta 17 de ago. de 2003
Respostas 10
Participantes 3