2016-12-26 10 views
1

Я хочу извлечь хэштеги из предложения. Для eg- , если приговорИспользование регулярного выражения для разбора хэштегов из предложения

#test1.#test2 #test3 www.google.com/#test4 www.google.com/hello#test5 

в хэштегов будет

#test1 
#test2 
#test3 

но не # test4 или # test5, поскольку они являются частью URL-

Я пытался сделать регулярное выражение для этого. до сих пор у меня есть

/(^|\s)#(\w+)\b/g 

https://regex101.com/r/WPeSdE/1

это берет на себя # test1 и # test3, но не может получить # test2.

Пожалуйста, помогите.

+0

Я думаю, вы хотите [это] (https: // regex101.com/r/BpBtM2/1) –

+0

@PavneetSingh, но он может быть полным чередом перед словом или запятой или любым символом, после которого может появиться слово, даже без пробела после символа – ghostCoder

+0

# (\ w +) работать нормально, нет? –

ответ

0

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

1

Match URL-адреса и матч и захватить в Хештеги, и просто захватить содержимое группы 1:

/\b(?:(?:https?|ftps?):\/\/|www\.)\S+|#(\w+)\b/gi 

См regex demo.

Деталь:

  • \b(?:(?:https?|ftps?):\/\/|www\.)\S+ - это URL, как шаблон:
    • \b - краевое слова
    • (: (:?? HTTPS | FTPS): // | WWW .) `- любой из:
      • (?:https?|ftps?):\/\/ - http://, или https:// (или же с ftp/ftps)
      • www\. - или www.
    • \S+ - 1 или более символов других, чем пробельные
  • | - или
  • #(\w+)\b - символ хэш, то группа 1 захват одного или нескольких символов слов (хэштегов), сопровождаемых границей слов.

Смотреть демо JS ниже:

var rx = /\b(?:(?:https?|ftps?):\/\/|www\.)\S+|#(\w+)\b/gi; 
 
var str = `#test1.#test2 #test3 www.google.com/#test4 www.google.com/hello#test5`; 
 
var m, res =[]; 
 
while ((m = rx.exec(str)) !== null) { 
 
    if (m[1]) res.push(m[1]); 
 
} 
 
console.log(res);