2013-06-05 3 views
11

Ich möchte, dass ein Regex einem einfachen Hashtag wie dem in Twitter entspricht (z. B. #someword). Ich möchte, dass auch Nicht-Standard-Zeichen (wie in Spanisch, Hebräisch oder Chinesisch) erkannt werden.Regex für einen (Twitter-ähnlichen) Hashtag, der Nicht-ASCII-Zeichen erlaubt

Das war meine ursprüngliche Regex: (^|\s|\b)(#(\w+))\b
-> aber es nicht nicht Standardzeichen erkennen.
Dann versuchte ich mit XRegExp.js, die funktionierte, aber lief zu langsam.

Irgendwelche Vorschläge, wie es geht?

+0

Wortgrenze kann nicht einfach mit Unicode verwendet werden. siehe http://www.unicode.org/reports/tr18/#Default_Word_Boundaries – Toto

Antwort

7

Schließlich fand ich das: twitter-text.js nützliche Link, die im Grunde ist, wie Twitter dieses Problem lösen.

+0

Die ausgezeichnete Repo verschoben hier: https://github.com/twitter/twitter-text/tree/master/js, wo es mit einer Liste für alle Sprachen zusammengefasst wurde: https://github.com/twitter/twitter-text – user1128896

0

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

Erläuterung: Dieser reguläre Ausdruck für ein # durch ein oder mehrere nicht-# Zeichen folgen suchen, gefolgt von 0 oder mehr Leerzeichen, Komma oder Semikolon.

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

Ergebnis:

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

EDIT - Ersetzt \ b für Wortgrenze

+0

Das '' 'nach dem' + 'bedeutet nur" sei nicht zu gierig ", wenn du versuchst, alle Nicht-Hash-Zeichen abzugleichen. – itsmejodie

+0

Ich glaube nicht, dass '\ b' mit nicht-lateinischen Zeichen arbeitet. – georg

+1

Mit dem '?' es passt nicht zu "# mañana" und ohne es "# mañana baby" als einen Hashtag zu regonisieren. Ganz zu schweigen von Hebräisch - erkennt überhaupt nicht. – limlim

2

Mit nativer JS Regexes, die nicht Unicode unterstützen, ist die einzige Möglichkeit, um explizit Zeichen aufzuzählen, die enden kann der Tag und Spiel alles anderes, zum Beispiel:

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

die [\s.,:,] sollte Leerzeichen, Interpunktion und was auch immer als abschließendes Symbol betrachtet werden kann.