Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
31 / 31 / 12
Регистрация: 25.07.2015
Сообщений: 120

Изменение регистра букв с использованием regex

24.09.2016, 18:15. Показов 6342. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Продолжаю изучать регулярки, понравилась мне эта штука Делаю следующее задание:
Кликните здесь для просмотра всего текста
Дан текст. Буквы в произвольном регистре. Сделать так, чтобы каждое предложение начиналось с буквы верхнего регистра. Все остальные буквы должны быть в нижнем регистре.

Написал вот такой код:
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
public class Task28 {
 
    private static final String REGEX_FIRST_LETTER = "(?<=\\. |^)\\w";
    private static final String REGEX_NOT_FIRST_LETTER = "(?<!\\. |^)\\w";
 
    private StringBuilder builder = new StringBuilder();
 
    public Task28(StringBuilder builder) {
        this.builder.append(builder);
    }
 
    public String notFirstToLower() {
        Matcher matcher = Pattern.compile(REGEX_NOT_FIRST_LETTER, Pattern.MULTILINE).matcher(builder);
        matcher.replaceAll("$0".toLowerCase());
    }
}

Но он не работает. И я не понимаю почему. По идее $0 - это результат поиска для нулевой группы. И я хочу перевести его в нижний регистр методом toLowerCase().
Сделал так.
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
public String notFirstToLower() {
    Matcher matcher = Pattern.compile(REGEX_NOT_FIRST_LETTER, Pattern.MULTILINE).matcher(builder);
    StringBuffer buffer = new StringBuffer();
    while (matcher.find()) {
        matcher.appendReplacement(buffer, matcher.group().toLowerCase());
    }
    matcher.appendTail(buffer);
    return buffer.toString();
}
Все работает. Но хотелось бы знать почему не работает первый вариант. Поиски в интернете не дали ответа, по крайней мере пытался.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.09.2016, 18:15
Ответы с готовыми решениями:

Изменение регистра символа
Измените регистр символа, если он был латинской буквой: сделайте его заглавным, если он был строчной буквой и наоборот. Для этого напишите...

Изменение регистра букв.
Подскажите плиз код перевода букв вверхний регистр и наоборот!!! В C#)) Используя RadioButton, одну на верхний регистр, а другую на...

Изменение регистра букв в тексте
1. Есть некий русский текст (либо все строчные либо все заглавные буквы) 2. Есть база данных с таблицей со словами (в именительном...

6
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
28.09.2016, 10:47
Во первых, почему $0?
Во вторых, нафиг тут вообще регулярки?
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
28.09.2016, 12:17
была одна проблема, решили регулярками. теперь стало 2 проблемы
0
31 / 31 / 12
Регистрация: 25.07.2015
Сообщений: 120
28.09.2016, 16:09  [ТС]
LeX BB, xoraxax, не я решил использовать регулярные выражения. Конкретно задание так поставлено (каюсь, не указал в сообщении).
Честно, не смог найти ссылку, по которой вычитал и смотрел примеры 24 числа. Сейчас нашел: это и это. Тогда я вычитал, что в регулярках обратная ссылка используется в таком виде "\1" (к примеру), а при замене строки - "$1". Где цифра - номер захваченной группы.
Или мне нужно было использовать захват группы по имени такого вида: (?<name>X)?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
28.09.2016, 16:18
Если ты, например сделаешь так, matcher.replaceAll("$0".toLowerCase()); это в любом случае не будет работать.
Т.е. все равно либо appendReplacement, либо перебирать matches и руками собирать строки с toUpperCase
1
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
28.09.2016, 17:04
Java
1
2
3
4
5
6
7
8
    public static void main(String[] args) {
        
        String str = "beware the Jabberwock, my son. the jaws that bite, the claws that catch!";
        str = str.toLowerCase();
        Matcher mtch = Pattern.compile("(?<=\\.|^)\\s*\\p{Lower}").matcher("");
        while (mtch.reset(str).find()) str = mtch.replaceFirst(mtch.group().toUpperCase());
        System.out.println(str);
    }
Bash
1
Beware the jabberwock, my son. The jaws that bite, the claws that catch!
1
31 / 31 / 12
Регистрация: 25.07.2015
Сообщений: 120
28.09.2016, 22:28  [ТС]
xoraxax, vcrop, я уже и сделал методами appendReplacement() и appendTail(). Сначала в мою голову залезла глупая мысль, что "$0" что-то возвращает. В процессе разбирательства, я уже понял насколько это нелепо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.09.2016, 22:28
Помогаю со студенческими работами здесь

Изменение регистра определенных букв
Доброго времени суток! Помогите пожалуйста довести до ума код. Задача такая. Мне нужно, чтобы при вводе текста в input он автоматически...

Изменение регистра введенных букв
Добрый день. Есть задание: Числовые значения символов нижнего регистра в коде ASCII отличаются от значении символов верхнего регистра...

Изменение регистра букв в тексте
Всем привет. Помогите пожалуйста с решением вот такой задачи. 1. Модифицировать текст таким образом, изменить регистр букв на большой....

Изменение регистра букв в строке
Помогите пожалуйста написать программу. Нужно задать строку из строчных и заглавных букв и преобразовать ее в ту же строку но с...

Изменение регистра букв в файле
В файле test.in записан текст на английском языке. Как изменить регистр алфавитных символов? (Пример: “Hello, World!” станет “hELLO,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru