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

Мне нужно захватить смайлы, например,

:)
:P
:-P
=)
:D
;)

И так далее, вместе с общим текстом. Это мое текущее регулярное выражение:

\b[0-9A-Za-z'\&\-\./()=:;]+\b

Однако он не соответствует() =:; по какой-то причине. Я что-то пропустил?

Изменить: На основе отзыва Mark здесь приведен пример, который мне нужно проанализировать:

hi =as.) friend :) haha yay! ;) =) test test) R&R I.O.U. 24/7

Это должно извлечь:

hi
friend
:)
haha
yay
;)
=)
test
test
R&R
I.O.U.
24/7

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

Ответ 1

Это пример, который фиксирует слово, за которым следуют приведенные выше примеры. Он захватывает одно слово и следующий смайлик в отдельных группах захвата. Рублевая ссылка.

\s(\w+)\s((?::|;|=)(?:-)?(?:\)|D|P))

Изменить. На основе изменений и данного примера это может быть желательным. Он определяет две группы захвата, одну для общего текста и одну для смайлика. Вот ссылка Rubular.

([0-9A-Za-z'\&\-\.\/\(\)=:;]+)|((?::|;|=)(?:-)?(?:\)|D|P))

Ответ 2

Я протестировал его здесь с Rubular. Если я уйду из /, тогда он будет работать. (Обновить: и удалить границы слова.)

[0-9A-Za-z'\&\-\.\/()=:;]+

Обновление. Выброс косой черты был сообщением об ошибке, которое я получил из rubular. Настоящая проблема заключается в якорях \b. Они соответствуют границе слова, т.е. Границе от [A-Za-z0-9_] до чего-то другого. это означает, что он не будет соответствовать значению :-), потому что граница слова отсутствует.

Ответ 3

Если вы удаляете \b перед классом символов и за классом символа или выполняете его/его работу.

Я думаю, причина, по которой она работает, когда вы удаляете границу слова, состоит в том, что она будет соответствовать словам с буквенно-цифровыми символами... если я не ошибаюсь.