Java - поиск слов, имеющих более 1 заглавной буквы - PullRequest
1 голос
/ 22 июля 2010

Просто нужна ваша помощь относительно задания для поиска в Java. Мне нужно прочитать строку из файла и составить список всех слов, которые содержат более 1 заглавной буквы.

Например, если строка: В этой UniverSe

есть семь планет.

Результат должен быть: SeVen и UniverSe

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

Ниже приведен небольшой пример, который я использовал, но он возвращает false, хотя я думаю, что он должен возвращать true.

System.out.println ( "Это" .matches ( "[A-Z] {2,}"));

Может кто-нибудь взглянуть на это и предложить способы достижения моего результата? Цени любую помощь.

Спасибо

AJ

Ответы [ 8 ]

7 голосов
/ 22 июля 2010

[A-Z]{2,} означает 2 или более последовательных заглавных буквы.Вы можете использовать [A-Z].*[A-Z], что позволит использовать любые другие символы между двумя заглавными буквами.

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

2 голосов
/ 22 июля 2010
\b(?:[a-z]*[A-Z]){2}[a-z]*\b

будет соответствовать словам, которые содержат как минимум две заглавные буквы.

Если вы хотите разрешить слова, которые содержат другие буквы, отличные от ASCII, используйте

\b(?:\p{Ll}*\p{Lu}){2}\p{Ll}*\b

Конечно, встрока Java, вам нужно экранировать (удвоить) обратную косую черту.

Итак, вы получите:

Pattern regex = Pattern.compile("\\b(?:\\p{Ll}*\\p{Lu}){2}\\p{Ll}*\\b");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    // matched text: regexMatcher.group()
    // match start: regexMatcher.start()
    // match end: regexMatcher.end()
}
2 голосов
/ 22 июля 2010

Может быть [a-z]*[A-Z][a-z]*[A-Z][a-z]* может работать .. дело в том, что подсчет с {..} не допускает использование символов между двумя буквами.

1 голос
/ 22 июля 2010

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

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

Я не помню точный синтаксис (я собираюсь проверить), но что-то вроде .*[A-Z].*[A-Z].* обеспечит наличие двух верхних регистров

0 голосов
/ 06 января 2017

Вы можете использовать это регулярное выражение:

"SeVen" .matches ("[AZ]. [AZ] [a-zA-Z] ") // true

"SeveNEight" .matches ("[AZ]. [AZ] [a-zA-Z] ") // true

"seVeneight" .matches ("[AZ]. [AZ] [a-zA-Z]") // false

0 голосов
/ 14 января 2015

я использую это регулярное выражение /[A-Z].[A-Z]+/

0 голосов
/ 22 июля 2010
    Pattern pat = Pattern.compile("\\w*[A-Z]\\w*[A-Z]\\w*");
    Matcher matcher = pat.matcher("There are SeVen Planets In this UniverSe");
    while ( matcher.find() ) {
        System.out.println(matcher.group());
    }

Prints

SeVen
UniverSe

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

0 голосов
/ 22 июля 2010

Ваше текущее регулярное выражение соответствует только последовательности из двух или более букв верхнего регистра, а не кратных по всему слову.Таким образом, вы должны соответствовать THis и tHIS, но не ThiS, как вы обнаружили.

Вам нужно искать заглавную букву, возможно, строчную, а затем другую заглавную.Или в регулярном выражении: [A-Z]\w*?[A-Z]

Если вы хотите найти всю строку без необходимости сначала разбивать ее, то включите возможность использования других символов слова на обоих концах и позвольте выражению захватить: (\w*?[A-Z]\w*?[A-Z]\w*)

Также обратите внимание, что мы используем неохотные квантификаторы, чтобы они прекратили сопоставление при первой же возможности в первых двух случаях, и обычный (жадный) квантификатор в конце, чтобы подобрать остальную часть слова.Подробнее о различных квантификаторах здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...