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

W PHP można użyć wyrażenia regularnego, aby uzyskać substr przez $1,Jak uzyskać substr w ten sposób wc?

jak mam to zrobić w C?

Lepiej jest, jeśli można to zrobić bez regex.

UPDATE

Mówiąc prościej, jak mogę dostać werwerur z swerwer werwerur y (drugi)?

Odpowiedz

2

polecam użyć strchr() - jest bardzo szybki, aby znaleźć znaki w ciągi

 
#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); 

jeśli masz wiele ograniczników, można użyć strtok_r() lub strpbrk(), jak w poniższym przykładzie:

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

(kod powinien oczyszczania: w przypadku, gdy strpbrk zwraca NULL)

2

Użyj funkcji strtok(), aby znaleźć spacje.

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

Łańcuch może mieć dowolną długość, więc 'strtok()' może być nieefektywne. – httpinterpret

+0

@ httpinterpret Czego naprawdę chcesz? Nie jestem magikiem z liniowym poszukiwaniem. – WhirlWind

+0

To znaczy, że nie ma potrzeby, aby tokenizować cały ciąg znaków, ponieważ zależy mi tylko na dwóch pierwszych. – httpinterpret

0

Jeśli dobrze rozumiem, co chcesz poprawnie, należy sscanf móc wykonać zadanie:

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

Ponieważ dopasowana długość jest nieznana, więc ten rodzaj "wyniku" o stałej długości może w pewnych przypadkach się nie udać. – httpinterpret

0

Państwo mogli zajrzeć do pomieszczeń w char-string za pomocą tego :

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 
    } 
} 

Jeśli szukasz drugiego słowa, po prostu musisz zapisać pozycje pierwszej przestrzeni i drugiej przestrzeni i uzyskać ciąg znaków na indeksach między nimi.

0

Jeśli używasz systemu posix/unix jak Linux, można użyć API regex bezpośrednio:

$> man 3 regex 

lub Google dla regcomp() lub regexec().