Выражение регулярного выражения для захвата слов между строками и слов без переносов

Я пытаюсь написать регулярное выражение в Java, которое соответствует словам и дефисным словам. Пока что у меня есть:

Pattern p1 = Pattern.compile("\\w+(?:-\\w+)",Pattern.CASE_INSENSITIVE);
Pattern p2 = Pattern.compile("[a-zA-Z0-9]+",Pattern.CASE_INSENSITIVE);
Pattern p3 = Pattern.compile("(?<=\\s)[\\w]+-$",Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

Это мой тестовый пример:

    программы
    Dsfasdf. Программы Программы Dsfasdf. Dsfasdf. вау вау! во. во? Хорошо. 
    он сказал: "привет". aasdfa. wsdfalsdjf. Go-Go Go-
в
asdfasdf..,:; " ' ()?! - / \ @ # $ % & ^ ~ `  * [ ] { } + _ 123

Любая помощь будет потрясающей

Мой ожидаемый результат будет соответствовать всем словам т.е.

Программы Dsfasdf Программы Программы Dsfasdf Dsfasdf
как это вау вау вау вау ладно он сказал привет aasdfa
wsdfalsdjf go-to go-to asdfasdf 

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

то есть.

идти-
в

2 ответа

Решение
\ Р {Ь}+(:-?\ П \ р {Ь}+)*
\   /^\ /^\ /\   /^^^
 \ / | | | |  \ / |||
  |  | | | |   |  ||`- Предыдущий может повторяться 0 или более раз (группа литералов '-', необязательная новая строка и одна или несколько букв (верхний / нижний регистр))
  | | | | | | | `- Завершить первую группу без захвата
  | | | | | | `--- Соответствует одному или нескольким предыдущим (любая буква, прописная / строчная)
  | | | | | `------ Соответствует любой букве (верхний / нижний регистр)
  | | | | `---------- Соответствует одной новой строке (необязательно из-за`?`)
  |  | | `------------ Буквально '-'
  |  | `-------------- Начать первую группу без захвата
  | `---------------- Соответствует одному или нескольким предыдущим (любая буква между AZ (верхний / нижний регистр))
  `------------------- Совпадение с любой буквой (верхний / нижний регистр)

Это нормально?

Я бы пошел с регулярным выражением:

\p{L}+(?:\-\p{L}+)*

Такое регулярное выражение должно совпадать также со словами "жених", "à-la-carte" и другими словами, содержащими некоторые специальные символы категории "буквы". \p{L} соответствует одной кодовой точке в категории "буква".

Другие вопросы по тегам