我试图然后提取并纠正单词中间的大写字母。
我想到了这个 regex ,但是它并没有完全满足我的要求,它只是检测部分想要的结果。
[A-Z]([a-z][A-Z]?)+|[a-z]([A-Z][a-z]?)+
参见此处:https://www.regexplanet.com/share/index.html?share=yyyyd810vnr
示例:
Input:
Il CodiCe della mappa non deVe usCire dalla tomba.
正则表达式应标识: CodiCe,deVe,usCire .. ,以便稍后将其更正为小写。
Input:
E il CodiCe per deCifrare la mappa si troVa a Volubilis, ViCino alle roVine romane in MaroCCo.
正则表达式应标识: CodiCe,deCifrare,troVa,Volubilis,ViCino,roVine,MaroCCo
注意:段开头的单词应排除在外。
答案 0 :(得分:1)
您可以使用此正则表达式来匹配其中包含至少一个大写字母的任何单词,但在任何情况下都将忽略匹配的第一个单词。
\b(?<!^)(?=[a-z]*[A-Z])[a-zA-Z]+\b
这是一个Java代码,它将为您提供字符串,其中每个带有大写字母的单词都将使用matcher.appendReplacement
转换为小写字母
List<String> sentenceList = Arrays.asList("Il CodiCe della mappa non deVe usCire dalla tomba.",
"E il CodiCe per deCifrare la mappa si troVa a Volubilis, ViCino alle roVine romane in MaroCCo.");
Pattern p = Pattern.compile("\\b(?<!^)(?=[a-z]*[A-Z])[a-zA-Z]+\\b");
sentenceList.forEach(x -> {
System.out.println("Input: " + x);
Matcher m = p.matcher(x);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, m.group().toLowerCase());
}
m.appendTail(sb);
System.out.println("Lowercased string: " + sb);
System.out.println();
});
打印
Input: Il CodiCe della mappa non deVe usCire dalla tomba.
Lowercased string: Il codice della mappa non deve uscire dalla tomba.
Input: E il CodiCe per deCifrare la mappa si troVa a Volubilis, ViCino alle roVine romane in MaroCCo.
Lowercased string: E il codice per decifrare la mappa si trova a volubilis, vicino alle rovine romane in marocco.
答案 1 :(得分:0)
如何用首字母与其余小写字母替换字符串:
String input = "E il CodiCe per deCifrare la mappa si troVa a Volubilis, ViCino alle roVine romane in MaroCCo.";
String[] parts = input.split(" ");
StringBuilder sb = new StringBuilder();
for (int i=0; i < parts.length; ++i) {
if (i > 0) sb.append(" ");
sb.append(parts[i].substring(0, 1)).append(parts[i].substring(1).toLowerCase());
}
System.out.println(sb);
E il Codice per decifrare la mappa si trova a Volubilis, Vicino alle rovine romane in Marocco.
答案 2 :(得分:0)