Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Liado con expresión regular

Estas en el tema de Liado con expresión regular en el foro de Javascript en Foros del Web. Hola, quería recoger de un texto las palabras completas que empiezan por @ para hacer algo parecido a lo que hace twitter. Encontre [URL="http://msdn.microsoft.com/es-es/library/h5181w5w.aspx"]esto[/URL] donde ...
  #1 (permalink)  
Antiguo 11/05/2013, 11:26
 
Fecha de Ingreso: febrero-2013
Ubicación: salinas
Mensajes: 5
Antigüedad: 11 años, 2 meses
Puntos: 0
Liado con expresión regular

Hola, quería recoger de un texto las palabras completas que empiezan por @ para hacer algo parecido a lo que hace twitter.

Encontre [URL="http://msdn.microsoft.com/es-es/library/h5181w5w.aspx"]esto[/URL]
donde dice que \bare\w*\b devuelve palabras completas que comienzan con "are".

Pero esto no me devuelve nada.

str=" @usuario ";

array=str.match(/\b@\w*\b/);

¿Alguien me puede decir como es? Las expresiones regulares son superiores a mi.

Gracias por adelantado y un saludo.
  #2 (permalink)  
Antiguo 11/05/2013, 12:34
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Liado con expresión regular

buenas...
realmente es sencillo. lo que sucede es que estás usando el boundary incorrecto. el boundary \b es un ancla que posiciona el puntero entre un caracter \w y \W, o viceversa, \W y \w. comúnmente se le conoce como word boundary porque intenta parear los límites de las palabras. lo que significa, que con el patrón /\b@\w*\b/, no podría encontrar coincidencia en el string " @usuario " porque el arroba y el caracter anterior (espacio) pertenecen a una misma clase, \W. para que pueda coincidir en ese string, antes del arroba debería haber un caracter de la clase \w, por ejemplo " a@usuario ". el resultado devuelto por el patrón con el string anterior sería @usuario.

¿la solución? usar la versión contraria de word-boundary (\b), non-word boundary \B. el ancla \B pocisiona el puntero entre dos caracteres de la misma clase. es decir, entre dos caracteres de la clase \W o la clase \w. por ejemplo, el patrón /\B\w+/ en el string "usuario" devuelve el string "suario" ya que el ancla se posiciona entre la primera "u" y "s". en fin, el patrón que necesitas es /\B@\w+\b/g.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 11/05/2013 a las 12:41
  #3 (permalink)  
Antiguo 11/05/2013, 13:42
 
Fecha de Ingreso: febrero-2013
Ubicación: salinas
Mensajes: 5
Antigüedad: 11 años, 2 meses
Puntos: 0
Respuesta: Liado con expresión regular

Cita:
Iniciado por zerokilled Ver Mensaje
buenas...
realmente es sencillo. lo que sucede es que estás usando el boundary incorrecto. el boundary \b es un ancla que posiciona el puntero entre un caracter \w y \W, o viceversa, \W y \w. comúnmente se le conoce como word boundary porque intenta parear los límites de las palabras. lo que significa, que con el patrón /\b@\w*\b/, no podría encontrar coincidencia en el string " @usuario " porque el arroba y el caracter anterior (espacio) pertenecen a una misma clase, \W. para que pueda coincidir en ese string, antes del arroba debería haber un caracter de la clase \w, por ejemplo " a@usuario ". el resultado devuelto por el patrón con el string anterior sería @usuario.

¿la solución? usar la versión contraria de word-boundary (\b), non-word boundary \B. el ancla \B pocisiona el puntero entre dos caracteres de la misma clase. es decir, entre dos caracteres de la clase \W o la clase \w. por ejemplo, el patrón /\B\w+/ en el string "usuario" devuelve el string "suario" ya que el ancla se posiciona entre la primera "u" y "s". en fin, el patrón que necesitas es /\B@\w+\b/g.
Muchas gracias, está bien saber lo de las clases, utilicé /\B@\w*\b/g y perfecto.

Saludos.

Etiquetas: expresiones, regulares
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:13.