Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Eliminar contenido dentro de paréntesis (https://www.clubdelphi.com/foros/showthread.php?t=91470)

ZayDun 13-02-2017 19:26:34

Eliminar contenido dentro de paréntesis
 
Hola,

Tengo un memo que contiene frases o palabras dentro de paréntesis y quiero eliminar todo ese contenido, incluido los paréntesis, había pensado en utilizar AnsiReplaceStr pero al contener diferentes palabras no he sabido continuar, alguien me puede ayudar o indicarme como debería de hacerlo?


Dejo un ejemplo por si han quedado dudas

Código:

Texto de (eliminar_esto) ejemplo.

maeyanes 13-02-2017 20:13:34

Hola...

Algo rápido y de memoria:

Código Delphi [-]
var
  PStart: integer;
  PEnd: integer;
  Text: string;

begin
  Text := 'Texto de (eliminar_esto) ejemplo.';
  PStart := Pos('(', Text);
  PEnd := Pos(')', Text);
  Delete(Text, PStart, (PEnd - PStart) + 1);
end;

Saludos...

AgustinOrtu 13-02-2017 21:07:12

Puede haber mas de una ocurrencia? Es decir:

Código:

Texto de (eliminar_esto) ejemplo (esto tambien).

ZayDun 13-02-2017 22:49:30

antes de nada agradecer el código a maeyanes, aun no he podido hacer la prueba.

Cita:

Empezado por AgustinOrtu (Mensaje 513223)
Puede haber mas de una ocurrencia? Es decir:

Código:

Texto de (eliminar_esto) ejemplo (esto tambien).



Así es AgustinOrtu, en el memo existen mas ocurrencias, error mio al no indicarlo.. como ya he dicho no he podido hacer la prueba pero supongo utilizando el código maeyanes y colocando un "for" que recorrar todo el memo debería de ser suficiente, ¿no?

Gracias por los comentarios a ambos :)

mamcx 13-02-2017 23:39:38

Podrias usar una expresion regular o simplemente implementar un "analisis de lexico" que es una forma eficiente y simple de implementar un parser muy basico (que aplica a este caso).

Hay todo un tutorial de esto en

https://en.wikibooks.org/wiki/Compil...xical_analysis

Ajustarlo se ve simple. Como sea, es solo recurrer caracter por caracter, detectar si los caracteres que interesan y acumular lo demas, que parece aun mas simple en tu caso:

En pseudocodigo:

Código Delphi [-]
procedure scan(text:String Or TextStream; beginChar, endChar:Char):String
begin
    result = ""

    for char in text
    begin
        if char == beginChar
        begin
            for nextChar in text
            begin
                if nextChar ==endChar
                    advanceOne //comerse el )
                    break
            end
        end
        result = result + char
    end
    return result
end

escafandra 14-02-2017 00:23:33

¿Hay paréntesis anidados?
Código:

Esto es (un ejemplo(de paréntesis) anidado)
Saludos.

AgustinOrtu 14-02-2017 02:16:16

La funcion System.Pos devuelve la primera ocurrencia del string indicado

Tenes que implementar algo mas sofisticado como comenta mamcx

AgustinOrtu 14-02-2017 03:12:49

Una manera muy sencilla de hacerlo:

Código Delphi [-]
const
  Input = 'Texto de(elimi(nar_es)to) ejemplo(esto tambien).';
  Expected = 'Texto de ejemplo.';
var
  Output: string;
  BracketCount: Integer;
  Each: Char;
begin
  BracketCount := 0;
  for Each in Input do
  begin
    if Each = '(' then
      Inc(BracketCount)
    else if Each = ')' then
      Dec(BracketCount)
    else if BracketCount = 0 then
      Output := Output + Each;
  end;

  Assert(Output = Expected);
end.

bitbow 14-02-2017 17:15:35

Jeje, ya me vole la funcion, muy buena por cierto.

Saludos.


La franja horaria es GMT +2. Ahora son las 09:54:08.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi