Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: condotiero en 19 Marzo 2015, 11:01 am



Título: Sintaxis REGEXP para sustituir una palabra x otra
Publicado por: condotiero en 19 Marzo 2015, 11:01 am
Buenos días.

Estoy trabajando con fuentes de noticias RSS en un programa de gestión de contenidos (digital signage). El programa permite parsear y filtrar los ítems y urls de varias maneras (también a través de expresiones regulares), pero soy neófito en el tema y no sé qué sintaxis debo poner para poder reemplazar una palabra x otra utilizando una expresión regular.

Muchas gracias por anticipado.


Título: Re: Sintaxis REGEXP para sustituir una palabra x otra
Publicado por: engel lex en 19 Marzo 2015, 13:25 pm
primero necesitas una función replace y su sisntaxis, ya que pueden trabajar de formas diferentes, pero normalmente los grupos de captura los retornan como $1, $2... así hasta el $9

Regex es un poco acido y complicado al inicio, pero eventualmente se vuelve super util...

necesitas saber las características de lo buscado y del resultado, si indicas eso puedo ayudarte


Título: Re: Sintaxis REGEXP para sustituir una palabra x otra
Publicado por: Eleкtro en 19 Marzo 2015, 16:01 pm
Te pongo un breve ejemplo:

Tienes esta cadena de texto:
Código:
Hola, Mundo!

Tienes esta expresión regular:
Código:
"(.+)(\,)(\s+)(.+)(\!)"

Cada pareja de paréntesis representa un grupo, cada grupo es una especie de delimitador de captura, y a la expresión debes añadirle otra pareja de paréntesis imaginaria de esta manera: "((.+)(\,)(\s+)(.+)(\!))" que representa el primer grupo de todos (es decir la captura completa), por ende:

Grupo 0: "Hola, Mundo!"
Grupo 1: "Hola"
Grupo 2: ","
Grupo 3: " "
Grupo 4: "Mundo"
Grupo 5: "!"

Conociendo lo que hemos capturado, los grupos de los que consta la captura, el índice de los grupos, y dando por hecho que se utilice el símbolo "$" para interpretar un grupo, entonces solo debemos inercambiar los grupos en el orden deseado, por ejemplo, la unión de los grupos "$4$2$3$1$5" o también "Mundo, $1!" darían cómo resultado:
Código:
Mundo, Hola!



El programa o lenguaje que estés utilizando debe tener funcionalidades de reemplazado (o replace) cómo te ha comentado el compañero Engel Lex.

Cabe mencionar que existen diferencias de sintaxis del motor Regex puede dependiendo del lenguaje en el que se utilice, por ejemplo te puedes encontrar que los grupos se representan con un símbolo/sintaxis diferente en otro lenguaje de scripting,
además de eso, en lenguajes orientados a objetos, el manejo de los grupos se suele hacer mediante el uso de miembros (classes y propiedades), en lugar de interpretar símbolos cómo "$0".

Lee las documentación de la Wikipedia, que muy pocas fuentes superan esta información:
Regular expression - Wikipedia, the free encyclopedia (http://en.wikipedia.org/wiki/Regular_expression)
 
Por último, te muestro un ejemplo en VB.Net (en C# sería lo mismo):

Código
  1. Imports System.Text.RegularExpressions
  2.  
  3. Public NotInheritable Class Form1
  4.  
  5.    Dim input As String = "Hola, Mundo!"
  6.    Dim format As String
  7.    Dim replace As String
  8.  
  9.    Dim regEx As New Regex("(.+)(\,)(\s+)(.+)(\!)", RegexOptions.IgnoreCase)
  10.  
  11.    Private Sub Test() Handles MyBase.Shown
  12.  
  13.        Dim matches As MatchCollection = regEx.Matches(input)
  14.        Dim value1 As String = matches(0).Groups(1).Value ' "Hola"
  15.        Dim value2 As String = matches(0).Groups(2).Value ' ","
  16.        Dim value3 As String = matches(0).Groups(3).Value ' " "
  17.        Dim value4 As String = matches(0).Groups(4).Value ' "Mundo"
  18.        Dim value5 As String = matches(0).Groups(5).Value ' "!"
  19.  
  20.        format = String.Format("{0}{1}{2}{3}{4}",
  21.                               value4, value2, value3, value1, value5)
  22.  
  23.        replace = input.Replace(value1, value4).
  24.                        Replace(value3 & value4, value3 & value1)
  25.  
  26.        Debug.Print(format)
  27.        Debug.Print(replace)
  28.  
  29.    End Sub
  30.  
  31. End Class

Saludos