2012-09-25 3 views
5

Sto scrivendo un raschietto hashtag per Facebook e ogni regex che ho riscontrato per ottenere gli hashtag sembra includere la punteggiatura e caratteri alfanumerici. Ecco un esempio di ciò che vorrei:Regex per corrispondere a tutti gli hashtag alfanumerici, senza simboli

Hello #world! Sto facendo # m4king su un raschietto #fac_book e vorrei una bella #espressione regolare.

Vorrei che per abbinare world, m4king, fac e expression (nota che vorrei di tagliare fuori se raggiunge la punteggiatura, spazi inclusi). Sarebbe bello se non includesse il simbolo dell'hash, ma non è molto importante.

Solo nel caso in cui sia importante, userò il metodo di scansione delle stringhe di ruby ​​per afferrare probabilmente più di un tag.

Grazie mille in anticipo!

risposta

5

Una espressione regolare come questa: #([A-Za-z0-9]+) deve corrispondere a ciò che è necessario e inserirlo in un gruppo di acquisizione. È quindi possibile accedere a questo gruppo più tardi. Forse this aiuterà a far luce sulle espressioni regolari (da un contesto Ruby).

L'espressione regolare sopra inizierà corrispondenza quando trova un tag # e getterà eventuali seguenti lettere o numeri in un gruppo di cattura. Una volta trovato qualcosa che non è una lettera o una cifra, fermerà la corrispondenza. Alla fine finirai con un gruppo contenente ciò che stai cercando.

+0

Grazie! Ci leggerò sicuramente! –

6
str = 'Hello #world! I am #m4king a #fac_book scraper and would like a nice regular #expression' 
str.scan(/#([A-Za-z0-9]+)/).flatten #=> ["world", "m4king", "fac", "expression"] 

La chiamata a #flatten è necessaria perché ciascun gruppo di acquisizione si troverà all'interno del proprio array.

In alternativa, è possibile utilizzare look-dietro di corrispondenza che abbinerà caratteri alfanumerici solo dopo un '#':

str.scan /(?<=#)[[:alnum:]]+/ #=> ["world", "m4king", "fac", "expression"] 
+0

Grazie! Ci sarebbe qualche vantaggio nell'usare la prima versione rispetto alla seconda? Sembra che il secondo sia molto più semplice (e presumo un po 'più performante del dover appiattire il primo) –

2

Ecco una regex più semplice #[[:alnum:]_]/. Nota che include sottolineatura perché Facebook include attualmente trattini di sottolineatura come parte degli hashtag (come fa Twitter).

str = 'Hello #world! I am #m4king a #fac_book scraper and would like a nice regular #expression' 
str.scan(/#[[:alnum:]_]+/) 

Ecco una vista sul Rubular: http://rubular.com/r/XPPqwtVGN9