elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Es posible usar ( como expresion regular? c++ <regex>
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Es posible usar ( como expresion regular? c++ <regex>  (Leído 3,037 veces)
statham

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Es posible usar ( como expresion regular? c++ <regex>
« en: 2 Febrero 2019, 14:24 pm »

Buenas chicos estoy leyendo un gran documento donde debo sacar los nombres y calves (es un ejercicio, nada malo).

Lo que pasa que los nombres si los consigo sacar con
Código:
regex e("\\b(name )([^ ]*)");
ya que vienen detras de un name, pero las calve no al estar entre parentesis

Si uso
Código:
regex p("\\b(()([^ ]*)");
me salta error en la memoria

Ejemplo del documento:

name Turing
key (31)

ese 31 no consigo cogerlo.

Un saludo


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Es posible usar ( como expresion regular? c++ <regex>
« Respuesta #1 en: 2 Febrero 2019, 16:01 pm »

Las expresines regulares, tienen la importante limitación de no admitir recursividad, por eso Chomsky las ubicó en la jerarquía (que hoy lleva su nombre), como gramáticas de tipo 3.

Al no admitir recursividad, se cae en un bucle infinito... por eso, cuando lo que se deba hacer exija recursividad, debe recurrirse como mínimo a una gramática libre de contexto... (gramáticas de tipo 2).


En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Es posible usar ( como expresion regular? c++ <regex>
« Respuesta #2 en: 2 Febrero 2019, 17:20 pm »

No sirve escapar los paréntesis?
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Es posible usar ( como expresion regular? c++ <regex>
« Respuesta #3 en: 2 Febrero 2019, 18:06 pm »

La verdad es que es mucho más fácil con scanf.
En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.156



Ver Perfil
Re: Es posible usar ( como expresion regular? c++ <regex>
« Respuesta #4 en: 2 Febrero 2019, 23:49 pm »

Saludos,

- Anda! en ninguno de mis libros en español he encontrado algo sobre expresiones regulares en C++ :-\, he tenido de echar mano de este otro buen libro en Inglés The C++ Standard Library 2nd Edition: https://www.mica.edu.vn/perso/Vu-Hai/EE3490/Ref/The%20C++Standard%20Library%20-%202nd%20Edition.pdf pág 717 (Chapter 14 Regular Expressions) Wow, la verdad está explicado muy bien, fácil de entender, bastante ejemplificado y práctico, comparándolo con los enigmáticos libros de Bjarne Stroustrup, pues puede ser el creador y todo pero sus libros no son sencillos de comprender :xD

Código
  1. name Turing
  2. key (31)
  3.  
  4. name Pepe
  5. key (54)
  6.  
  7. name Vlad
  8. key (12)

Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <regex>
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8.  ifstream file("example.txt");
  9.  regex n("(^name\\s)(\\w+)");
  10.  regex k("(^key\\s\\()(\\d+)(\\))");
  11.  smatch m;
  12.  string line;
  13.  while ( getline(file, line) ) {
  14.    if ( regex_search(line, m, n) ) {
  15.      cout << m[2] << endl;
  16.    } else if ( regex_search(line, m, k) ) {
  17.      cout << m[2] << endl;
  18.    }
  19.  }
  20.  file.close();
  21.  return 0;
  22. }

Código
  1. C:\Users\EdSon\Desktop>g++ regex.cpp -o regex.exe && regex.exe
  2. Turing
  3. 31
  4. Pepe
  5. 54
  6. Vlad
  7. 12
  8.  
  9. C:\Users\EdSon\Desktop>
En línea

statham

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Re: Es posible usar ( como expresion regular? c++ <regex>
« Respuesta #5 en: 4 Febrero 2019, 16:49 pm »

Saludos,

- Anda! en ninguno de mis libros en español he encontrado algo sobre expresiones regulares en C++ :-\, he tenido de echar mano de este otro buen libro en Inglés The C++ Standard Library 2nd Edition: https://www.mica.edu.vn/perso/Vu-Hai/EE3490/Ref/The%20C++Standard%20Library%20-%202nd%20Edition.pdf pág 717 (Chapter 14 Regular Expressions) Wow, la verdad está explicado muy bien, fácil de entender, bastante ejemplificado y práctico, comparándolo con los enigmáticos libros de Bjarne Stroustrup, pues puede ser el creador y todo pero sus libros no son sencillos de comprender :xD

Código
  1. name Turing
  2. key (31)
  3.  
  4. name Pepe
  5. key (54)
  6.  
  7. name Vlad
  8. key (12)

Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <regex>
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8.  ifstream file("example.txt");
  9.  regex n("(^name\\s)(\\w+)");
  10.  regex k("(^key\\s\\()(\\d+)(\\))");
  11.  smatch m;
  12.  string line;
  13.  while ( getline(file, line) ) {
  14.    if ( regex_search(line, m, n) ) {
  15.      cout << m[2] << endl;
  16.    } else if ( regex_search(line, m, k) ) {
  17.      cout << m[2] << endl;
  18.    }
  19.  }
  20.  file.close();
  21.  return 0;
  22. }

Código
  1. C:\Users\EdSon\Desktop>g++ regex.cpp -o regex.exe && regex.exe
  2. Turing
  3. 31
  4. Pepe
  5. 54
  6. Vlad
  7. 12
  8.  
  9. C:\Users\EdSon\Desktop>


Buenas, gracias por contestar.
La cosa se complica con el siguiente ejemplo:

A : in XXX (31 downto 0);  
B : in XXX (6 downto 0);

Aqui XXX puede ser en cada linea una palabra diferente, pero no hay problema, consigo sacarla.
La cosa es sacara ese 31 y 6 que van despues del (, al igual que no puedo hacer referencia o eso creo a XXX ya que va cambiando por cada fila

Código:

regex e("\\b(in )([^ ]*)");
regex r("\\b(out )([^ ]*)");
smatch m;
regex p("\\()(\\d+)(\\)");

for (int j = 0; j < ioput[i].icont; j++) {
getline(archivo, s);


while (std::regex_search(s, m, e)) {//aqui saco XXX

for (auto x : m) {
aux = x;
}

ioput[i].input[j].type = aux;
std::cout << std::endl;
s = m.suffix().str();
}

//Aqui s tiene como valor (31 down to 0)


while (std::regex_search(s, m, p)) {//aqui buscaria el 31 despues del ( pero me da error al inicializar p

for (auto x : m) {
aux = x;
}

ioput[i].input[j].longitud = stoi(aux);
cout << ioput[i].input[j].longitud;
std::cout << std::endl;
s = m.suffix().str();
}
}
En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.156



Ver Perfil
Re: Es posible usar ( como expresion regular? c++ <regex>
« Respuesta #6 en: 4 Febrero 2019, 17:17 pm »

- Lee el libro que recomendé arriba, por ejemplo en javascript sería así:

Código
  1. var str = "A : in XXX (31 downto 0);"
  2. var mat = (/\bin (\w+) \((\d+)/g).exec(str);
  3. console.log("Valor de xxx: " + mat[1]);
  4. console.log("Valor (num): " + mat[2]);

Código
  1. Valor de xxx: XXX
  2. Valor (num): 31
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Expresión regular « 1 2 3 »
PHP
IWKY 29 20,594 Último mensaje 25 Enero 2010, 23:57 pm
por ~ Yoya ~
Problema con expresión regular
PHP
egyware 7 5,980 Último mensaje 12 Febrero 2010, 00:32 am
por ~ Yoya ~
Perl Regular Expressions (Regex)
Scripting
¨°o.O (ßa¢Kg|姧) O.o° 1 3,080 Último mensaje 5 Julio 2010, 21:43 pm
por ~ Yoya ~
ayudita expresion regular « 1 2 3 4 »
Programación Visual Basic
viher 38 12,688 Último mensaje 6 Noviembre 2010, 21:25 pm
por Psyke1
Expresion Regular
Desarrollo Web
SistemasSures 2 2,356 Último mensaje 19 Febrero 2018, 20:39 pm
por pangeasi
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines