Înlocuiți șirul cu o parte din reglajul de potrivire

Am un șir lung. Vreau să înlocuiesc toate meciurile cu o parte din grupul de potrivire.

De exemplu:

String = "This is a great day, is it not? If there is something, THIS IS it. is".

Vreau să înlocuiesc toate cuvintele "este" , de exemplu, "

este

" . Cazul ar trebui să rămână identic cu cel original. Deci ultimul șir pe care îl vreau este:
This 

is

 a great day, 

is

 it not? If there 

is

 something, 
THIS 

IS

 it. 

is

.

Regexul pe care-l încercam:

Pattern pattern = Pattern.compile("[.>, ](is)[.<, ]", Pattern.CASE_INSENSITIVE);
0
Modelul se potrivește bine. Ceea ce nu înțeleg este cum să înlocuiți.
adăugat autor varunl, sursa
Când ați încercat, ce sa întâmplat?
adăugat autor Tony Ennis, sursa

6 răspunsuri

Clasa Matcher este frecvent utilizată împreună cu Pattern . Utilizați metoda Matcher.replaceAll() pentru a înlocui toate potrivirile din șir

String str = "This is a great day...";
Pattern p = Pattern.compile("\\bis\\b", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(str);
String result = m.replaceAll("

is

");

Note: Using the \b regex command will match on a word boundary (like whitespace). This is helpful to use in order to ensure that only the word "is" is matched and not words that contain the letters "i" and "s" (like "island").

0
adăugat

Asa:

str = str.replaceAll(yourRegex, "

$1

");

$ 1 se referă la textul capturat de grupul # 1 din regex.

0
adăugat
Dezavantajul acestei soluții este că va fi întotdeauna sensibil la minuscule. Nu există nicio modalitate de a defini regexul pentru a nu fi insensibil.
adăugat autor Michael, sursa
Oh, nu știu asta. Ignorați comentariul meu. :(
adăugat autor Michael, sursa
@Michael - Doar includeți un modificator (? I) la începutul regexului dacă aveți nevoie de insensibilitate de la caz la caz.
adăugat autor Jirka Hanika, sursa

Pur și simplu utilizați o referință de retur pentru asta.

"This is a great day, is it not? If there is something, THIS IS it. is".replaceAll("[.>, ](is)[.<, ]", "

$2

"); should do.
0
adăugat
Din nou, nu puteți spune că regex-ul este insensibil cu privire la această soluție.
adăugat autor Michael, sursa
Cu toate acestea, puteți prefixa șirul de regex cu (? I) pentru a face ca literele să nu fie sensibile.
adăugat autor Michael, sursa

Michael's answer is better, but if you happen to specifically only want [.>, ] and [.<, ] as boundaries, you can do it like this:

String input = "This is a great day, is it not? If there is something, THIS IS it. is";
Pattern p = Pattern.compile("(?<=[.>, ])(is)(?=[.<, ])", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(input);
String result = m.replaceAll("

$1

");
0
adăugat
yourStr.replaceAll("(?i)([.>, ])(is)([.<, ])","$1

$2

$3")

(?i)to indicate ignoring case; wrap everything your want to reuse with brackets, reuse them with $1 $2 and $3, concatenate them into what you want.

0
adăugat

It may be a late addition, but if anyone is looking for this like
Searching for 'thing' and also he needs 'Something' too to be taken as result,

Pattern p = Pattern.compile("([^ ])is([^ \.])");
String result = m.replaceAll("<\h1>$1is$2");

will result <\h1>Something too

0
adăugat