Pytanie Regex dla hashtagu (twitter-like), który pozwala na znaki spoza ASCII


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).

To było moje pierwsze wyliczenie: (^|\s|\b)(#(\w+))\b
-> ale nie rozpoznaje znaków niestandardowych.
Potem próbowałem używać XRegExp.js, który działał, ale działał zbyt wolno.

Wszelkie sugestie, jak to zrobić?


11
2018-06-05 13:55


pochodzenie


Granicy słowa nie można po prostu używać z unikodem. widzieć unicode.org/reports/tr18/#Default_Word_Boundaries - Toto


Odpowiedzi:


W końcu znalazłem to: twitter-text.js przydatny link, w zasadzie w jaki sposób twitter rozwiązuje ten problem.


7
2018-06-16 12:46



Doskonałe przeniesienie przeniesiono tutaj: github.com/twitter/twitter-text/tree/master/js gdzie został zsumowany z listą dla wszystkich języków: github.com/twitter/twitter-text - user1128896


W przypadku natywnych wyrażeń regularnych JS, które nie obsługują kodu Unicode, jedyną opcją jest jawne wyliczenie znaków, które mogą zakończyć tag i dopasować wszystko inne, na przykład:

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

The [\s.,:,] powinny zawierać spacje, znaki interpunkcyjne i cokolwiek innego można uznać za symbol kończący.


2
2018-06-05 14:36





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

Objaśnienie: To wyrażenie regularne wyszuka a # po którym następuje co najmniej jeden# znaków, a następnie 0 lub więcej spacji, przecinków lub średników.

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

Wynik:

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

EDYCJA - Zastąpiono \ b dla granicy słowa


0
2018-06-05 14:23



The ? po + po prostu oznacza "nie bądź zbyt chciwy", gdy próbujesz dopasować wszystkie nie-hashowe postacie. - itsmejodie
Nie sądzę \b działa ze znakami innymi niż łacińskie. - georg
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
Granica słowa \b jest asercją o zerowej długości, która jest prawdziwa między znakiem słownym a nie-słowem - Toto
Jak wskazano \ b nie jest poprawne, gdy mamy do czynienia ze znakami innymi niż łacińskie. Zrewidowałem swoją odpowiedź. Zazwyczaj hash-tags nie zawierają spacji @limlim - itsmejodie