2010-10-14 6 views
0

J'ai une chaîne qui contient le texte suivantjava String.replaceAll regex question

String my_string = "hello world. it's cold out brrrrrr! br br"; 

J'aimerais remplacer chaque isolébr avec <br />

Le problème est que je d aiment éviter de convertir la chaîne en

"hello world. it's cold out <br />rrrrr! <br /> <br />"; 

Ce que je voudrais faire est conve rt la chaîne (à l'aide replaceAll) à

"hello world. it's cold out brrrrrr! <br /> <br />"; 

Je suis sûr que cela est très simple, mais mon regex n'est pas correct.

my_string.replaceAll("\\sbr\\s|\\sbr$", "<br />"); 

mon regex est supposé pour trouver 'la fin de la ligne' 'espaces' 'b' 'r' 'espaces' OR 'espaces' 'b' 'r'

mais il manque le final "br" dans ma chaîne

"hello world. it's cold out brrrrrr!<br />br" 

qu'est-ce que je fais mal ?? TKS!

+0

'' bonjour monde, il fait froid dehors brrrrr!
br " ' Votre 'br' final n'est pas précédé par des espaces. –

Répondre

8

Utilisez

my_string.replaceAll("\\bbr\\b", "<br />"); 

Votre regex ne fonctionne pas parce que dans

␣br␣br 
^ 

Le modèle \sbr\s consommera toute ␣br␣, laissant

<br />br 
    ^

maintenant il n'y a pas d'espace précédent pour ce br pour correspondre \sbr$, de sorte qu'il sera manqué. En revanche, \b, signifiant une limite de mot, est une assertion de largeur nulle, c'est-à-dire qu'il ne consommera aucun caractère. Par conséquent, les espaces seront conservés et tous les br seront comparés.

+0

ok, alors laissez-moi voir si je comprends bien ... \ b est limite de mot, non? et apparemment, ça marche aussi en "fin de ligne"? – user141146

+0

La fin d'une ligne est une limite de mot si le dernier caractère de la ligne est un caractère de mot :. Plus d'infos: http://www.regular-expressions.info/wordboundaries.html –

+0

@ user141146: Oui. – kennytm

0

"hello world. it's cold out brrrrrr!<br />br" Votre 'br' final n'est pas précédé d'un espace. Qu'est-ce qui est censé arriver?