Regular expressions

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

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!!! ?

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!

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.

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 :?

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

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

Ja fiz isso :slight_smile:

[quote=“marciolx”]Juntando tudo:

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

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

[code][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…[/code]

[quote=“Morcego”]
Poix… o problema é q se eu tiver por exemplo:

[code][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…[/code][/quote]

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

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!

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.