Es posible usar ( como expresion regular? c++ <regex>

Iniciado por statham, 2 Febrero 2019, 14:24 PM

0 Miembros y 1 Visitante están viendo este tema.

statham

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 regex e("\\b(name )([^ ]*)");
ya que vienen detras de un name, pero las calve no al estar entre parentesis

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

Ejemplo del documento:

name Turing
key (31)

ese 31 no consigo cogerlo.

Un saludo

Serapis

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).

CalgaryCorpus

Aqui mi perfil en LinkedIn, invitame un cafe aqui

MAFUS


EdePC

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 (xml) [Seleccionar]
name Turing
key (31)

name Pepe
key (54)

name Vlad
key (12)


Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <regex>

using namespace std;

int main() {
  ifstream file("example.txt");
  regex n("(^name\\s)(\\w+)");
  regex k("(^key\\s\\()(\\d+)(\\))");
  smatch m;
  string line;
  while ( getline(file, line) ) {
    if ( regex_search(line, m, n) ) {
      cout << m[2] << endl;
    } else if ( regex_search(line, m, k) ) {
      cout << m[2] << endl;
    }
  }
  file.close();
  return 0;
}


Código (ini) [Seleccionar]
C:\Users\EdSon\Desktop>g++ regex.cpp -o regex.exe && regex.exe
Turing
31
Pepe
54
Vlad
12

C:\Users\EdSon\Desktop>

statham

Cita de: 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 (xml) [Seleccionar]
name Turing
key (31)

name Pepe
key (54)

name Vlad
key (12)


Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <regex>

using namespace std;

int main() {
 ifstream file("example.txt");
 regex n("(^name\\s)(\\w+)");
 regex k("(^key\\s\\()(\\d+)(\\))");
 smatch m;
 string line;
 while ( getline(file, line) ) {
   if ( regex_search(line, m, n) ) {
     cout << m[2] << endl;
   } else if ( regex_search(line, m, k) ) {
     cout << m[2] << endl;
   }
 }
 file.close();
 return 0;
}


Código (ini) [Seleccionar]
C:\Users\EdSon\Desktop>g++ regex.cpp -o regex.exe && regex.exe
Turing
31
Pepe
54
Vlad
12

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



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();
}
}


EdePC

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

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


Código (dios) [Seleccionar]
Valor de xxx: XXX
Valor (num): 31