RegEx для проверки наличия заглавных букв в строке - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь извлечь, а затем исправить заглавные буквы , найденные в середине слова.

Я думал об этом регулярное выражение , но он не делает именно то, что я хочу, он только определяет части желаемых результатов .

[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

ПРИМЕЧАНИЕ. Слова в начале сегмента следует исключать.

Ответы [ 3 ]

1 голос
/ 06 мая 2019

Вы можете использовать это регулярное выражение, которое будет соответствовать любому слову, содержащему хотя бы одну заглавную букву, за исключением того, что в любом случае оно будет игнорировать совпадение с первым словом.

\b(?<!^)(?=[a-z]*[A-Z])[a-zA-Z]+\b

Regex Demo

А вот 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.
0 голосов
/ 06 мая 2019

Это регулярное выражение также находит все эти слова.

\b\w+[A-Z]+\w+\b

https://regex101.com/r/5lyTG3/4

0 голосов
/ 06 мая 2019

Как насчет замены строки на первую букву, соединенную с остатком в нижнем регистре:

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...