2010-05-07 10 views
5
/^[^\s]+\s([^\s]+)\s/ 

En PHP, puedo usar expresiones regulares para obtener el substr por $1,¿Cómo obtengo el substr de esta manera en c?

cómo debería hacerlo en C?

Es mejor si puede hacerlo sin expresiones regulares, sin embargo.

ACTUALIZACIÓN

En pocas palabras, ¿cómo consigo werwerur de swerwer werwerur y (el segundo)?

Respuesta

2

me recomiendan usar strchr() - que es muy rápido para encontrar caracteres en cadenas

 
#include <string.h> 
.. 
char str[] = "swerwer werwerur y"; 
char *p1 = NULL,*p2 = NULL; 

p1 = strchr(str,' '); 
p1++; 
p2 = strchr(p1,' '); 
if(p2) *p2 = 0; 

printf("found: %s\n", p1); 

si tiene varios delimitadores, puede utilizar strtok_r() o strpbrk() como en el siguiente ejemplo:

 
    char str[] = "swerwer ., werwerur + y"; 
    const char *dlms = " .,+"; 
    char *p1 = NULL,*p2 = NULL; 

    p1 = strpbrk(str,dlms); 
    while(strchr(dlms,*p1)) p1++; 
    p2 = strpbrk(p1,dlms); 
    if(p2) *p2 = 0; 

    printf("found: %s\n", p1); 

(debe código de limpieza: en el caso si strpbrk devuelve NULL)

2

Use strtok() para buscar los espacios.

Strtok man page:

#include <string.h> 
... 
char *token; 
char *line = "LINE TO BE SEPARATED"; 
char *search = " "; 


/* Token will point to "LINE". */ 
token = strtok(line, search); 


/* Token will point to "TO". */ 
token = strtok(NULL, search); 
+0

La cadena puede ser arbitary de largo, por lo que 'strtok()' puede ser ineficiente. – httpinterpret

+0

@httpinterpret ¿Qué * realmente * quieres? No soy un mago de búsqueda lineal. – WhirlWind

+0

Quiero decir que no es necesario tokenizar toda la cadena ya que solo me importan los primeros dos. – httpinterpret

0

Si entiendo lo que quiere correctamente, sscanf debe ser capaz de hacer el trabajo:

char result[256]; 
sscanf("swerwer werwerur y", "%*s %255s", result); 
+0

Como la longitud coincidente es desconocida, este tipo de 'resultado 'de longitud fija puede fallar en ciertos casos. – httpinterpret

0

Se podría buscar espacios en un char-cadena utilizando este :

char* strText = "word1 word2 word3"; 
int iTextLen = strlen(strText); 
for(int i = 0; i < iTextLen; i++) 
{ 
    if(strText[i] == ' ') //is it a space-character 
    { 
     //save position or whatever 
    } 
} 

Si está buscando la segunda palabra, solo tiene que guardar la posiciones del primer espacio y del segundo espacio y obtener la cadena de caracteres en los índices entre los dos.

0

Si está utilizando un sistema/Unix POSIX como Linux, puede utilizar la API de expresiones regulares directamente:

$> man 3 regex 

O google para regcomp() o regexec().

Cuestiones relacionadas