2013-06-05 25 views
11

Chcę, aby wyrażenie regularne pasowało do prostego hashtagu podobnego do tego w twitterze (np. #someword). Chcę również, aby rozpoznała niestandardowe znaki (takie jak te w języku hiszpańskim, hebrajskim lub chińskim).Regex o hasztag (twitter-like), który zezwala na znaki spoza ASCII

To był mój pierwszy wyrażeń: (^|\s|\b)(#(\w+))\b
-> ale nie rozpoznaje znaków niestandardowych.
Następnie próbowałem użyć XRegExp.js, który działał, ale działał zbyt wolno.

Wszelkie sugestie, jak to zrobić?

+0

Granicy słowa nie można po prostu używać z unikodem. zobacz http://www.unicode.org/reports/tr18/#Default_Word_Boundaries – Toto

Odpowiedz

7

W końcu znalazłem to: twitter-text.js przydatne łącze, które w zasadzie to jak twitter rozwiązuje ten problem.

+0

Doskonałe repo przeniesione tutaj: https://github.com/twitter/twitter-text/tree/master/js, gdzie zostało zsumowane z listą dla wszystkich języków: https://github.com/twitter/twitter-text – user1128896

0

#([^#]+)[\s,;]*

Objaśnienie: To wyrażenie regularne wyszuka # następnie przez jeden lub więcej znaków spoza #, a następnie przez 0 lub więcej pomieszczeń, przecinkami lub średnikami.

var input = "#hasta #mañana #babהַ"; 
var matches = input.match(/#([^#]+)[\s,;]*/g); 

Wynik:

["#hasta ", "#mañana ", "#babהַ"] 

EDIT - Zastąpiony \ b na granicy słowa

+0

'' 'po' + 'oznacza po prostu" nie bądź zbyt chciwy ", gdy próbujesz dopasować wszystkie nie-hashowe znaki. – itsmejodie

+0

Nie sądzę, że '\ b' działa z znakami innymi niż łacińskie. – georg

+1

Z "?" nie pasuje do "# mañana" i bez tego regonize "# mañana baby" jako jeden hashtag. Nie wspominając już o hebrajskim - w ogóle nie rozpoznaje. – limlim

2

z rodzimymi JS regexes, które nie obsługują Unicode, jedyną opcją jest jednoznacznie wyliczyć znaki, które może zakończyć tag i dopasuj wszystko inne, na przykład:

> s = "foo #הַתִּקְוָה. bar" 
"foo #הַתִּקְוָה. bar" 
> s.match(/#(.+?)(?=[\s.,:,]|$)/) 
["#הַתִּקְוָה", "הַתִּקְוָה"] 

The [\s.,:,] powinien zawierać spacje, znaki interpunkcyjne i cokolwiek innego może być uważane za symbol kończący.