2012-09-25 10 views
5

Escribo un hashtag scraper para Facebook, y cada expresión regular que encuentro para obtener hashtags parece incluir signos de puntuación y caracteres alfanuméricos. Aquí hay un ejemplo de lo que me gustaría:Regex para que coincida con todos los hashtags alfanuméricos, sin símbolos

Hola #world! Estoy # m4king un raspador #fac_book y me gustaría una #expresión normal.

me gustaría para que coincida con world, m4king, fac y expression (nota que me gustaría que se cortó si alcanza puntuacion, incluidos los espacios). Sería bueno si no incluyera el símbolo hash, pero no es súper importante.

Solo en caso de que sea importante, utilizaré el método de escaneo de cadenas de ruby ​​para obtener posiblemente más de una etiqueta.

¡Gracias montones por adelantado!

Respuesta

5

Un regex como este: #([A-Za-z0-9]+) debe coincidir con lo que necesita y colocarlo en un grupo de captura. Luego puede acceder a este grupo más tarde. Tal vez this ayudará a arrojar algo de luz sobre las expresiones regulares (de un contexto de Ruby).

La expresión anterior anterior comenzará a coincidir cuando encuentre una etiqueta # y arrojará las siguientes letras o números en un grupo de captura. Una vez que encuentre algo que no sea una letra o un dígito, detendrá el emparejamiento. Al final terminarás con un grupo que contiene lo que buscas.

+0

Gracias! ¡Definitivamente lo leeré! –

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 llamada a #flatten es necesaria porque cada grupo de captura estará dentro de su propia matriz.

Como alternativa, puede utilizar vistazo detrás coincidencia que coincidirá con caracteres alfanuméricos sólo después de un '#':

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

¡Gracias! ¿Habría algún beneficio al usar la primera versión sobre la segunda? Parece que el segundo es mucho más simple (y supongo que es un poco más eficiente que tener que aplanar el primero) –

2

Aquí es una expresión regular más simple #[[:alnum:]_]/. Tenga en cuenta que incluye guiones bajos porque Facebook actualmente incluye guiones bajos como parte de hashtags (como lo hace Twitter).

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

Aquí es una vista en Rubular: http://rubular.com/r/XPPqwtVGN9

Cuestiones relacionadas