Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: statham en 2 Febrero 2019, 14:24 pm



Título: Es posible usar ( como expresion regular? c++ <regex>
Publicado por: statham 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


Título: Re: Es posible usar ( como expresion regular? c++ <regex>
Publicado por: Serapis 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).


Título: Re: Es posible usar ( como expresion regular? c++ <regex>
Publicado por: CalgaryCorpus en 2 Febrero 2019, 17:20 pm
No sirve escapar los paréntesis?


Título: Re: Es posible usar ( como expresion regular? c++ <regex>
Publicado por: MAFUS en 2 Febrero 2019, 18:06 pm
La verdad es que es mucho más fácil con scanf.


Título: Re: Es posible usar ( como expresion regular? c++ <regex>
Publicado por: EdePC 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>


Título: Re: Es posible usar ( como expresion regular? c++ <regex>
Publicado por: statham 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();
}
}


Título: Re: Es posible usar ( como expresion regular? c++ <regex>
Publicado por: EdePC 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