Как сопоставить смайлики с регулярными выражениями?
Мне нужно захватить смайлы, например,
:)
: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 перед классом символов и за классом символа или выполняете его/его работу.
Я думаю, причина, по которой она работает, когда вы удаляете границу слова, состоит в том, что она будет соответствовать словам с буквенно-цифровыми символами... если я не ошибаюсь.