регулярное выражение, которое извлекает слова из строки - PullRequest
3 голосов
/ 29 июня 2010

Я хочу извлечь все слова из строки Java.

Слово может быть написано на любом европейском языке и не содержит пробелов, только буквенные символы.

может содержать дефисы.

Ответы [ 3 ]

3 голосов
/ 29 июня 2010

Если вы не привязаны к регулярным выражениям, взгляните также на BreakIterator , в частности на метод getWordInstance () :

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

2 голосов
/ 29 июня 2010

Вы можете использовать вариацию (?<!\S)\S+(?!\S), то есть любую максимальную последовательность непробельных символов.

  • Используются отрицательные обходные пути, чтобы они могли соответствовать «словам» в начале и концестрока
  • Замените собственный класс символов на \S, чтобы найти что-то более конкретное
    • (например, [A-Za-z-] и т. д.)

Вот простой пример, иллюстрирующий идею, используя [a-z-] в качестве класса символов алфавита:

    String text = "--xx128736f-afasdf2137asdf-12387-kjs-23xx--";
    Pattern p = Pattern.compile(
        "(?<!alpha)alpha+(?!alpha)".replace("alpha", "[a-z-]")
    );
    Matcher m = p.matcher(text);
    while (m.find()) {
        System.out.println(m.group());
    }

Это печатает:

--xx
f-afasdf
asdf-
-kjs-
xx--

Ссылки


Но каким должен быть алфавит?

Вы можетедолжны использовать классы символов Unicode и т. д. (оставайтесь на месте, изучая тему прямо сейчас)

0 голосов
/ 29 июня 2010

Это будет соответствовать одному слову:

`([^\s]+)`
...