[LINUX] Regulärer Ausdruck in regex.h

myreg.cpp



#include <sys/types.h>
#include <regex.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

#include <string>
#include <map>

typedef std::string Str;
typedef std::map< int, Str > Mis;
typedef std::map< int, Mis > Mimis;
int myreg( Str input_string, Str pattern, Mimis &ret, size_t back_ref_size = 42 );

int myreg( Str input_string, Str pattern, Mimis &result, size_t back_ref_size ) {
	
	int ret = 0;
	regex_t rg;
	
	//cflag ist vorerst REG_Mit EXTENDED. In der Regcomp-Manpage erfahren Sie, wie sich das Verhalten ändert.
	ret = regcomp( &rg, pattern.c_str(), REG_EXTENDED );
	
	if( ret ) {
		
		char buf[1024] = "";
		regerror( ret, &rg, buf, 1024 );
		
		fprintf( stderr, "regcomp failed. %s\n", buf );
		
		regfree( &rg );
		return( 1 );
		
	}
	
	int match_count = 0;
	
	while( 1 ) {
		
		regmatch_t *matching = new regmatch_t[back_ref_size];
		
		//eflag ist vorerst 0. In der Regexec-Manpage erfahren Sie, wie sich das Verhalten ändert.
		ret = regexec( &rg, input_string.c_str(), back_ref_size, matching, 0 );
		
		if( ret ) {
			
			//Dies ist kein Fehler, es hat nur keine Übereinstimmungen
			delete [] matching;
			break;
			
		}
		
		int first_end_index = -1; //Extrahieren Sie die erste hintere Position.
		int back_ref_count = 0;
		
		for( size_t i = 0; i < back_ref_size; ++i, ++back_ref_count ) {
			
			int start_index = matching[i].rm_so;
			int end_index = matching[i].rm_eo;
			
			if( start_index == -1 || end_index == -1 ) {
				
				break;
				
			}
			
			if( i == 0 ) {
				
				first_end_index = end_index;
				
				//Leere Match-Maßnahmen.
				if( start_index == end_index ) {
					
					++first_end_index;
					
				}
				
			}
			
			int len = end_index - start_index;
			
			if( len ) {
				
				result[match_count][back_ref_count] = input_string.substr( start_index, len );
				
			} else {
				
				result[match_count][back_ref_count] = "";
				
			}
			
		}
		
		if( first_end_index == -1 ) {
			
			delete [] matching;
			break;
			
		}
		
		input_string = input_string.substr( first_end_index );
		
		if( input_string.empty() ) {
			
			delete [] matching;
			break;
			
		}
		
		++match_count;
		
	}
	
	regfree( &rg );
	return( 0 );
	
}

int main( int argc, char **argv ) {
	
	if( argc != 3 ) {
		
		printf( "./myreg input_string pattern\n\n" );
		return( 1 );
		
	}
	
	printf( "input_string:\n%s\n", argv[1] );
	printf( "\n" );
	printf( "pattern:\n%s\n", argv[2] );
	printf( "\n" );
	
	Mimis result;
	
	if( myreg( argv[1], argv[2], result ) ) {
		
		return( 1 );
		
	}
	
	printf( "result:\n" );
	
	for( Mimis::iterator it = result.begin(), eit = result.end(); it != eit; ++it ) {
		
		for( Mis::iterator itt = it->second.begin(), eitt = it->second.end(); itt != eitt; ++itt ) {
			
			printf( "%d %d %s\n", it->first, itt->first, itt->second.c_str() );
			
		}
		
	}
	
	return( 0 );
	
}


Es scheint, dass reguläre Ausdrücke in C und C ++ nicht schnell verwendet werden können.

Aus diesem Grund habe ich mich für die POSIX-Regex-Funktion entschieden.

Und hier ist der Code, den ich gemacht habe.

Sie können auch die gesamte Match + Back-Referenz abrufen. (Es ist schwer, die gesamte Rückwärtsreferenzverarbeitung selbst zu schreiben, nicht wahr?)

Ausführungsergebnis unten


[todanano@localhost samba]$ ./myreg 'abc123def' '(abc).*(def)'
input_string:
abc123def

pattern:
(abc).*(def)

result:
0 0 abc123def
0 1 abc
0 2 def
[todanano@localhost samba]$
[todanano@localhost samba]$ ./myreg '192.168.0.1-192.168.0.254' '([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})'
input_string:
192.168.0.1-192.168.0.254

pattern:
([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})\.([[:digit:]]{1,3})

result:
0 0 192.168.0.1
0 1 192
0 2 168
0 3 0
0 4 1
1 0 192.168.0.254
1 1 192
1 2 168
1 3 0
1 4 254
[todanano@localhost samba]$
[todanano@localhost samba]$

Recommended Posts

Regulärer Ausdruck in regex.h
Regulärer Ausdruck in Python
Regulärer Ausdruck Gierig
Regulärer Ausdruck re
Start / End-Match im regulären Python-Ausdruck
Regulärer Ausdruck im Pymongo
Regulärer Ausdruck der Datumsnotation
Regulärer Ausdruck vorausschauend, nach Yomi
Python-Memo für reguläre Ausdrücke
Matching-Methode für reguläre Ausdrücke
Symbolischer Gruppenname für reguläre Ausdrücke in Python / Ruby
Bestätigungsquiz für reguläre Ausdrücke!
Verwenden Sie den let-Ausdruck in Python
Python-Theorie regulärer Ausdruck Anmerkungen
Verwenden Sie reguläre Ausdrücke in C.
Julia Quick Note [04] Regulärer Ausdruck
Manipulation regulärer Ausdrücke durch Python
Tool-Tool zur Überprüfung regulärer Ausdrücke
Reproduzieren Sie den regulären Python-Ausdruck r '\ w (? U)' in JavaScript
So erhalten Sie alle möglichen Werte in einem regulären Ausdruck
Zerlegen Sie den Hostnamen mit co.jp mit regulärem Ausdruck
String-Ersetzung durch regulären Python-Ausdruck
100 Sprachverarbeitung klopfen 2020: Kapitel 3 (regulärer Ausdruck)
Bei Verwendung regulärer Ausdrücke in Python
Funktionen von Modulen für reguläre Ausdrücke, die in Python häufig persönlich verwendet werden
Was ist in dem Parameter? String & Ausdruck bearbeiten
Verwenden Sie print in Python2 lambda expression
(Python) Hinweise zum Lesen von HTML und zur Verwendung regulärer Ausdrücke
Ersetzen Sie Nicht-ASCII durch reguläre Ausdrücke in Python
Verwenden Sie \ d nicht in regulären Python 3-Ausdrücken!
Suchen Sie den Pythonondict-Wörterbuchschlüssel nach regulären Ausdrücken
Verwendung regulärer Ausdrücke in Python