Лучшее HashTag Regex

Я пытаюсь найти все хэш-теги в строке. Хештаги из потока, как твиттер, они могут быть где угодно в тексте, например:

это событие #awesome, позволяет использовать tag #fun

Я использую .NET framework (С#), я думал, что это будет подходящий шаблон регулярного выражения:

#\ш +

Является ли это лучшим регулярным выражением для этой цели?

Ответ 1

Это зависит от того, хотите ли вы сопоставлять хэштеги внутри других строк ( "Some # Word" ) или вещи, которые, вероятно, не являются хэштегами ( "Мы №1" ). Регулярное выражение, которое вы дали #\w+, будет совпадать в обоих случаях. Если вы слегка измените свое регулярное выражение на \B#\w\w+, вы можете устранить эти случаи и только соответствовать хэштегам длиной больше 1 на границах слов.

Ответ 2

Если вы тянете статусы, содержащие хэштеги из Twitter, вам больше не нужно их находить. Теперь вы можете указать параметр include_entities, чтобы Twitter автоматически вызывал упоминания, ссылки и хэштеги.

Например, сделайте следующий вызов statuses/show:

http://api.twitter.com/1/statuses/show/60183527282577408.json?include_entities=true

В результирующем JSON обратите внимание на объект entity.

"entities":{"urls":[{"expanded_url":null,"indices":[68,88],"url":"http:\/\/bit.ly\/gWZmaJ"}],"user_mentions":[],"hashtags":[{"text":"wordpress","indices":[89,99]}]}

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

Если вам просто нужно регулярное выражение для поиска хэштегов, Twitter предоставляет их в библиотеке с открытым исходным кодом.

Шаблон соответствия Hashtag

(^|[^&\p{L}\p{M}\p{Nd}_\u200c\u200d\ua67e\u05be\u05f3\u05f4\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\u00b7])(#|\uFF03)(?!\uFE0F|\u20E3)([\p{L}\p{M}\p{Nd}_\u200c\u200d\ua67e\u05be\u05f3\u05f4\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\u00b7]*[\p{L}\p{M}][\p{L}\p{M}\p{Nd}_\u200c\u200d\ua67e\u05be\u05f3\u05f4\u309b\u309c\u30a0\u30fb\u3003\u0f0b\u0f0c\u00b7]*)

Вышеупомянутый шаблон может быть скомпонован из этого java файла (извлечен 2015-11-23). Тесты проверки для этого шаблона расположены в этом файле вокруг строки 128.

Ответ 3

Посмотрев на предыдущие ответы здесь и сделав некоторые тестовые твиты, чтобы увидеть, что нравится Twitter, я думаю, что у меня появилось твердое регулярное выражение, которое должно сделать трюк. Это требует функциональности поиска в движке регулярных выражений, поэтому он может не работать со всеми двигателями. Он должен работать отлично для .NET и PCRE.

(?:(?<=\s)|^)#(\w*[A-Za-z_]+\w*)

В соответствии с RegexBuddy это делает следующее: RegexBuddy Create View

И снова, согласно RegexBuddy, вот что он соответствует: RegexBuddy Test View

Все, что выделено, является частью матча. Более темная подсвеченная часть указывает, что возвращается из захвата.

Редактировать декабрь 2014:
Здесь немного упрощенная версия от нуля323, которая должна быть функционально эквивалентной:

(?<=\s|^)#(\w*[A-Za-z_]+\w*)

Ответ 4

Я написал твиттер со случайно размещенными тэгами хэша, увидел, что с ним сделал Twitter, а затем попытался сопоставить его с регулярным выражением. Вот что я получил:

\ В #\ш * [A-Za-Z] +\ш *

#face #Fa! ce что-то #iam # 1 # 1 # 919 #jifdosaj somethin # idfsjoa 9 # 9 # 98 9 # 9f9j # 9jlasdjl # jklfdsajl34 # 34239 #jkf #a * # 1j3rj3

Ответ 5

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

(^|\s)#([A-Za-z_][A-Za-z0-9_]*)

Примечание. Я также явно ограничил взгляды и lookbehind из-за их штрафов за производительность.

enter image description here

Ответ 7

это тот, который я написал, он ищет границы слов и только соответствует хэш-текстуу (?<=#)\w*?(?=\W).

Ответ 8

Я тестировал некоторые твиты и понял, что хэштеги:

  • Составляются буквенно-цифровыми символами плюс подчеркивание.
  • Должно быть не менее 1 буквы или подчеркивания.
  • Может иметь символ точки, но хэштег будет интерпретироваться как ссылка на внешний сайт. (Я не считаю это)

Итак, что у меня есть:

\B#(\w*[A-Za-z_]+\w*)