2012-08-07 11 views
8

me gustaría un poco de ayuda en averiguar la expresión regular JS utilizar para identificar los "hashtags", donde deben coincidir con todos los siguientes:Javascript expresiones regulares para hacer coincidir los hashtags del gorjeo similar

  1. El estilo habitual Twitter hashtags: #foobar
  2. hashtags con el texto anterior: abc123#xyz456
  3. hashtags con espacio en ellos, que se indican como: #[foo bar] (es decir, el [] sirve como delimitador para el hashtag)

Para 1 y 2, que estaba usando algo de la siguiente forma:

var all_re =/\S*#\S+/gi; 

Me parece que no puede encontrar la manera de extenderla a 3. No soy bueno en las expresiones regulares, un poco de ayuda ¿Por favor?

Gracias!

Respuesta

31

lo que tiene que coincidir con cualquiera de los caracteres que no sean espaciales o cualquier carácter entre (e incluyendo) [ y ]:

\S*#(?:\[[^\]]+\]|\S+) 

Explicación:

\S*    # any number of non-white space characters 
#     # matches # 
(?:    # start non-capturing group 
    \[    # matches [ 
    [^\]]+   # any character but ], one or more 
    \]    # matches ] 
    |    # OR 
    \S+   # one or more non-white space characters 
)     # end non-capturing group 

Referencia: alternation, negated character classes.

+0

Gracias felix. Estoy intentando esto en http://www.regular-expressions.info/javascriptexample.html con el Regexp como "\ S * # (?: \ S + | \ [[^ \]] + \])" y el cadena como "this is # [foo bar]". El botón "Mostrar coincidencia" dice "# [foo" - ¿estoy haciendo algo mal? – ragebiswas

+0

Ah, parece que tiene que invertir el orden porque '\ S +' es más general que '\ [...', por lo que siempre coincidirá. Fijo. –

+1

¡Gracias, especialmente por la explicación! – ragebiswas

2

¿Qué tal esto?

var all_re =/(\S*#\[[^\]]+\])|(\S*#\S+)/gi; 
+0

Esto también funciona, pero estoy aceptando la explicación de Félix. Gracias xiaowl! – ragebiswas

0

Tuve un problema similar, pero solo quiero hacer coincidir cuando una cadena se inicia y termina con la etiqueta. Así que un problema similar, ojalá alguien más pueda usar mi solución.

Éste coincide con "#myhashtag" pero no con "gfd # myhashtag" o "#myhashtag".

/^#\S+$/

^ #start of regex
\S #Any char that is not a white space
+ #Any number of said char
$ #End of string

Tan simple como eso.

Cuestiones relacionadas