Use Java y RegEx para convertir la envoltura en una cadena

Problema: a su vez

"My Testtext TARGETSTRING My Testtext" 

dentro

 "My Testtext targetstring My Testtext" 

Perl admite la operación “\ L” que se puede usar en la cadena de reemplazo.

Pattern-Class no es compatible con esta operación:

Construcciones de Perl no admitidas por esta clase: […] Las operaciones de preprocesamiento \ l \ u, \ L y \ U. https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html

No puedes hacer esto en Java regex. En su lugar, tendría que postprocesar manualmente usando String.toUpperCase() y toLowerCase() .

Aquí hay un ejemplo de cómo usar expresiones regulares para buscar y poner en mayúscula las palabras de longitud al menos 3 en una oración

  String text = "no way oh my god it cannot be"; Matcher m = Pattern.compile("\\b\\w{3,}\\b").matcher(text); StringBuilder sb = new StringBuilder(); int last = 0; while (m.find()) { sb.append(text.substring(last, m.start())); sb.append(m.group(0).toUpperCase()); last = m.end(); } sb.append(text.substring(last)); System.out.println(sb.toString()); // prints "no WAY oh my GOD it CANNOT be" 

Nota sobre appendReplacement y appendTail

Tenga en cuenta que la solución anterior utiliza una substring y administra un índice de tail , etc. De hecho, puede ir sin estos si usa Matcher.appendReplacement y appendTail .

  StringBuffer sb = new StringBuffer(); while (m.find()) { m.appendReplacement(sb, m.group().toUpperCase()); } m.appendTail(sb); 

Observe cómo sb ahora es un StringBuffer lugar de StringBuilder . Hasta que Matcher proporcione sobrecargas de StringBuilder , StringBuffer que utilizar el StringBuffer más lento si desea utilizar estos métodos.

Depende de usted si vale la pena o no la compensación con menos eficiencia para una mayor legibilidad.

Ver también

  • StringBuilder y StringBuffer en Java

Podría usar el grupo de captura de TARGETSTRING regulares (si realmente necesita usar expresiones regulares, es decir, si ” TARGETSTRING ” es lo suficientemente complejo y “regular” como para justificar que lo detecte una expresión regular).
Luego, aplicaría a toLowerCase() al grupo n. ° 1.

 import java.util.regex.*; public class TargetToLowerCase { public static void main(String[] args) { StringBuilder sb= new StringBuilder( "my testtext TARGETSTRING my testtext"); System.out.println(sb); String regex= "TARGETSTRING "; Pattern p = Pattern.compile(regex); // Create the pattern. Matcher matcher = p.matcher(sb); // Create the matcher. while (matcher.find()) { String buf= sb.substring(matcher.start(), matcher.end()).toLowerCase(); sb.replace(matcher.start(), matcher.end(), buf); } System.out.println(sb); } } 

Java9 +

Desde Java 9+ puede usar String :: replaceAll donde puede usar una Function por ejemplo, usamos el ejemplo de polygenelubricants :

 String text = "this is just a test which upper all short words"; String regex = "\\b\\w{0,3}\\b"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); String result = matcher.replaceAll(matche -> matche.group().toUpperCase()); System.out.println(result); 

O solo :

 String result = Pattern.compile(regex) .matcher(text) .replaceAll(matche -> matche.group().toUpperCase()); 

Salida

 this IS just A test which upper ALL short words ^^ ^ ^^^ 

Para hacer esto en el nivel de expresión regular, debe usar \U para activar el modo en mayúscula y \E para desactivarlo. Aquí hay un ejemplo de cómo usar esta función en IntelliJ IDEA diálogo de find-and-replace que transforma un conjunto de campos de clase en afirmaciones JUnit (en IDE tooltip es el resultado de la transformación de find-and-replace ):

enter image description here