使用Java和RegEx转换字符串中的大小写

问题描述 投票:32回答:4

问题:转

"My Testtext TARGETSTRING My Testtext" 

"My Testtext targetstring My Testtext"

Perl支持可以在替换字符串中使用的“\ L”操作。

Pattern-Class不支持此操作:

此类不支持的Perl构造:[...]预处理操作\ l \ u,\ L和\ U. https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html

java regex string uppercase lowercase
4个回答
53
投票

你不能在Java正则表达式中这样做。您必须使用String.toUpperCase()toLowerCase()手动后处理。

这是一个如何使用正则表达式来查找和大写句子中长度至少为3的单词的示例

    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"

Note on appendReplacement and appendTail

请注意,上面的解决方案使用substring并管理tail索引等。事实上,如果你使用Matcher.appendReplacementappendTail,你可以没有这些。

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

请注意sb现在是StringBuffer而不是StringBuilder。直到Matcher提供StringBuilder重载,如果你想使用这些方法,你就会遇到更慢的StringBuffer

这取决于能否提高效率以获得更高的可读性是否值得。

See also


8
投票

你可以使用regexp capturing group(如果你真的需要使用正则表达式,也就是说,意思是“TARGETSTRING”足够复杂并且“常规”足以证明正则表达式被检测到)。 然后,您将toLowerCase()应用于组#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);
  }
}

5
投票

Java9+

从Java 9+开始,你可以使用String::replaceAll,你可以使用Function<MatchResult, String>,例如我们使用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);

要不就 :

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

产量

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

4
投票

要在regexp级别执行此操作,您必须使用\U来打开大写模式,使用\E将其关闭。下面是一个如何在IntelliJ IDEA find-and-replace对话框中使用此功能的示例,该对话框将类字段集转换为JUnit断言(在IDE工具提示中是find-and-replace转换的结果):

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.