Получить первую букву каждого слова в строке с помощью регулярных выражений - PullRequest
5 голосов
/ 27 сентября 2011

Я пытаюсь получить первую букву каждого слова в строке с помощью регулярных выражений, вот что я пробовал:

public class Test
{
    public static void main(String[] args)
    {
        String name = "First Middle Last";
        for(String s : name.split("(?<=[\\S])[\\S]+")) System.out.println(s);
    }
}

Вывод выглядит следующим образом:

F
 M
 L

Как я могу исправить регулярное выражение, чтобы получить правильный вывод?

Ответы [ 6 ]

5 голосов
/ 27 сентября 2011

Редактировать Принял несколько предложений в комментариях, но сохранил \S, потому что \w является только буквенно-цифровым и может неожиданно сломаться на любых других символах.

Исправление регулярного выражения и все еще использование разделения:

name.split("(?<=[\\S])[\\S]*\\s*")
1 голос
/ 04 июля 2014

У меня недавно был этот вопрос в интервью, и я нашел это решение, посмотрев здесь.

String input = "First Middle Last";
Pattern p = Pattern.compile("(?<=\\s+|^)\\w");
Matcher m = p.matcher(input);

while (m.find()) {
    System.out.println(m.group());
}

Это регулярное выражение не будет собирать несловарные символы в начале строк.Так что, если кто-то вводит «Mike! Sis Strawberry», возвращаемое значение будет M, S. Это не тот случай, когда выбранный ответ возвращает M,!, S

Регулярное выражение работает с помощью поиска для символов из одного слова(\ w), которые имеют один или несколько пробелов (\ s +) или находятся в начале строки (^).

Чтобы изменить то, что ищется, \ w можно изменить на другое регулярное выражениедопустимые записи.

Чтобы изменить то, что предшествует символу поиска, измените (\ s + | ^).В этом примере \ s + используется для поиска одного или нескольких пробелов, а ^ используется для определения, находится ли символ в начале искомой строки.Чтобы добавить дополнительные критерии, добавьте символ канала, за которым следует допустимая запись поиска регулярного выражения.

1 голос
/ 27 сентября 2011

Иногда проще использовать другую технику. В частности, нет удобного метода «получить все подходящие регионы» (я думаю, вы могли бы создать свой собственный, но это требует больших усилий). Таким образом, мы преобразовываемся во что-то, с чем мы можем справиться:

String name = "First Middle Last";
for (String s : name.replaceAll("\\W*(\\w)\\w*\\W*","$1").split("\\B"))
    System.out.println(s);

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

String name = "First Middle Last";
for (String s : name.replaceAll("(\\w)\\w*","$1").split("\\W+"))
    System.out.println(s);
1 голос
/ 27 сентября 2011

(Отказ от ответственности: у меня нет опыта работы с Java, поэтому, если он обрабатывает регулярные выражения способами, которые делают это бесполезным, я приношу свои извинения.)

Если вы хотите избавиться от пробелов, предшествующих M и L, попробуйте добавить дополнительные пробелы в конце

(?<=[\\S])[\\S]+\\s*

Однако это может добавить дополнительный пробел в случае однобуквенных слов. Это может исправить это:

(?<=[\\S])[\\S]*\\s*
1 голос
/ 27 сентября 2011

Почему бы просто:

public static void main(String[] args)
{
    String name = "First Middle Last";
    for(String s : name.split("\\s+")) System.out.println(s.charAt(0));
}   
0 голосов
/ 27 сентября 2011

Это не исправление регулярного выражения, но добавление .trim () к выходной строке все еще работает:

String name = "First Middle Last";
for(String s : name.split("(?<=[\\S])[\\S]+")) System.out.println(s.trim());

output:

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