Autor
|
Tema: Es posible usar ( como expresion regular? c++ <regex> (Leído 3,037 veces)
|
statham
Desconectado
Mensajes: 19
|
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
|
|
|
En línea
|
|
|
|
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).
|
|
|
En línea
|
|
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
La verdad es que es mucho más fácil con scanf.
|
|
|
En línea
|
|
|
|
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 name Turing key (31) name Pepe key (54) name Vlad key (12)
#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:\Users\EdSon\Desktop>g++ regex.cpp -o regex.exe && regex.exe Turing 31 Pepe 54 Vlad 12 C:\Users\EdSon\Desktop>
|
|
|
En línea
|
|
|
|
statham
Desconectado
Mensajes: 19
|
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 name Turing key (31) name Pepe key (54) name Vlad key (12)
#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:\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(); } }
|
|
|
En línea
|
|
|
|
EdePC
|
- Lee el libro que recomendé arriba, por ejemplo en javascript sería así: 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]);
Valor de xxx: XXX Valor (num): 31
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Expresión regular
« 1 2 3 »
PHP
|
IWKY
|
29
|
20,594
|
25 Enero 2010, 23:57 pm
por ~ Yoya ~
|
|
|
Problema con expresión regular
PHP
|
egyware
|
7
|
5,980
|
12 Febrero 2010, 00:32 am
por ~ Yoya ~
|
|
|
Perl Regular Expressions (Regex)
Scripting
|
¨°o.O (ßa¢Kg|姧) O.o°
|
1
|
3,080
|
5 Julio 2010, 21:43 pm
por ~ Yoya ~
|
|
|
ayudita expresion regular
« 1 2 3 4 »
Programación Visual Basic
|
viher
|
38
|
12,688
|
6 Noviembre 2010, 21:25 pm
por Psyke1
|
|
|
Expresion Regular
Desarrollo Web
|
SistemasSures
|
2
|
2,356
|
19 Febrero 2018, 20:39 pm
por pangeasi
|
|