C에서 POSIX Regex 사용

Dzious

실제로 FTP, SSH 연결, 작업 관리자 등을 관리하기 위해 내 서버 텍스트 사용자 인터페이스를 만들려고합니다. 여기 내 문제는 작업 관리자에 있습니다.

내 작업을 저장하기 위해 모든 작업을 파일에 쓰기로 결정했습니다. 각 줄 (작업에 해당)이 다음과 같이 보이기를 바랍니다.

Year Month Day Week-Day Hour Min Second ; Command

로 쉬울 위해, 난 동일한 프로세스를 사용 크론 어디에 *해당 카테고리의 어느 순간에 해당

* * * * 00 00 00 ; reboot //allow me to run reboot everyday at midnight

이를 위해 POSIX regex 를 사용하기로 결정했습니다 . 형식을 지정하고 싶습니다.

YEAR [0-9] {1-9}
MONTH [0-9] {2}
DAY [0-9] {2}
WEEK-DAY [A-Z] [a-z] {3}
HOUR [0-9] {2}
MINUTE [0-9] {2}
SECOND [0-9] {2}

COMMAND can be any printable character

이로 인해 문제가 발생합니다. 이 정규식을 만들 수있었습니다.

char *regexString = "^(\\*|([[:digit:]]){1,9})[[:blank:]](\\*|([[:digit:]]){2})[[:blank:]](\\*|([[:digit:]]){2})[[:blank:]](\\*|([[:alpha:]]){3})[[:blank:]](\\*|([[:digit:]]){2})[[:blank:]](\\*|([[:digit:]]){2})[[:blank:]](\\*|([[:digit:]]){2})[[:blank:]];[[:blank:]]([[:print:]])*";

작동하는 것처럼 보이지만 여기 에서 찾은 이것을 사용 하여 각 구성 요소를 얻는 방법을 이해 하려고 시도했을 때 다음 과 같이 연결됩니다.

Output :
Match 0, Group 0: [ 0-25]: * * * * 00 00 00 ; reboot
Match 0, Group 1: [ 0- 1]: *

내가 이해하도록 도와 줄 수 있습니까? 감사 (:

추신 : 이것은 몇 가지 예입니다.

* * * * * * * ; command //Match
0 00 00 Mon 00 00 00 ; command //Match
123456789 00 00 Mon 00 00 00 ; command //Match

01234556789 00 00 Mon 00 00 00 ; command //Don't Match
0 00 00 0 00 00 00 ; command //Don't Match
0 0 0 Mon 0 0 0 ; command //Don't Match

편집 : 내가 사용하는 코드는 다음과 같습니다.

#include <stdio.h>
#include <string.h>
#include <regex.h>

int main ()
{
    char * source = "* * * * 00 00 00 ; reboot";
    char *regexString = "^(\\*|([[:digit:]]){1,9})[[:blank:]](\\*|([[:digit:]]){2})[[:blank:]](\\*|([[:digit:]]){2})[[:blank:]](\\*|([[:alpha:]]){3})[[:blank:]](\\*|([[:digit:]]){2})[[:blank:]](\\*|([[:digit:]]){2})[[:blank:]](\\*|([[:digit:]]){2})[[:blank:]];[[:blank:]]([[:print:]])*";
    size_t maxMatches = 3; //I've tried for sevrals values, 2, 3 ... same Output
    size_t maxGroups = 3; //I've tried for sevrals values, 2, 3 ... same Output

    regex_t regexCompiled;
    regmatch_t groupArray[maxGroups];
    unsigned int m;
    char * cursor;

    if (regcomp(&regexCompiled, regexString, REG_EXTENDED))
    {
        printf("Could not compile regular expression.\n");
        return 1;
    };

    m = 0;
    cursor = source;
    for (m = 0; m < maxMatches; m ++)
    {
        if (regexec(&regexCompiled, cursor, maxGroups, groupArray, 0))
            break;  // No more matches

        unsigned int g = 0;
        unsigned int offset = 0;
        for (g = 0; g < maxGroups; g++)
        {
            if (groupArray[g].rm_so == (size_t)-1)
                break;  // No more groups

            if (g == 0)
                offset = groupArray[g].rm_eo;

            char cursorCopy[strlen(cursor) + 1];
            strcpy(cursorCopy, cursor);
            cursorCopy[groupArray[g].rm_eo] = 0;
            printf("Match %u, Group %u: [%2u-%2u]: %s\n",
                   m, g, groupArray[g].rm_so, groupArray[g].rm_eo,
                   cursorCopy + groupArray[g].rm_so);
        }
        cursor += offset;
    }

    regfree(&regexCompiled);

    return 0;
}

예시 출력 :

//Case of a match :
Output :
Match 0, Group 0: [ 0-25]: * * * * 00 00 00 ; reboot
Match 0, Group 1: [ 0- 1]: * // YEAR
Match 0, Group 2: [ 2- 3]: * // MONTH
Match 0, Group 3: [ 4- 5]: * // DAY
Match 0, Group 4: [ 6- 7]: * // WEEK-DAY
Match 0, Group 5: [ 8- 10]: 00 //HOUR
Match 0, Group 6: [ 11- 13]: 00 //MINUTE
Match 0, Group 7: [ 14- 16]: 00 // SECOND
Match 0, Group 8: [ 20- 25]: reboot //COMMAND
$> echo $?
0

//Case of a match :
Output :
Match 0, Group 0: [ 0-38]: 123456789 00 00 Mon 00 00 00 ; Command
Match 0, Group 1: [ 0- 9]: 123456789 //YEAR
Match 0, Group 2: [ 10- 12]: 00 //MONTH
Match 0, Group 3: [ 13- 15]: 00 //DAY 
Match 0, Group 4: [ 16- 19]: Mon //WEEK-DAY
Match 0, Group 5: [ 20- 22]: 00 //HOUR
Match 0, Group 6: [ 23- 25]: 00 //MINUTE
Match 0, Group 7: [ 26- 28]: 00 //SECOND
Match 0, Group 8: [ 31- 38]: Command //COMMAND
$> echo $?
0

//Case of Not Match
$> echo $?
0
Wiktor Stribiżew

maxGroups변수를 설정할 때주의해야합니다 . 그 값은 패턴 + 1 (전체 일치 값, 첫 번째 항목)에있는 모든 캡처 그룹의 합계입니다.

모든 중복 캡처 그룹을 제거하고

char *regexString = "^(\\*|[[:digit:]]{1,9})[[:blank:]](\\*|[[:digit:]]{2})[[:blank:]](\\*|[[:digit:]]{2})[[:blank:]](\\*|[[:alpha:]]{3})[[:blank:]](\\*|[[:digit:]]{2})[[:blank:]](\\*|[[:digit:]]{2})[[:blank:]](\\*|[[:digit:]]{2})[[:blank:]];[[:blank:]]([[:print:]]*)";

정규식 ( 데모 참조 )에는 이제 8 개의 캡처 그룹이 있으므로 maxGroups값을 9다음 과 같이 설정하십시오 .

 size_t maxGroups = 9; // 8 groups + 1 for whole match

코드가 작동해야합니다 . 온라인 데모를 참조하십시오 .

maxMatches예상되는 일치 수보다 가깝거나 약간 높은 값으로 값 을 늘리는 것이 유용 할 수 있습니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C에서 POSIX Semaphore를 사용한 다중 스레딩

분류에서Dev

사전에서 RegEx 사용

분류에서Dev

Posix Semaphore에서 공유 메모리 사용 C에서 대기 및 신호

분류에서Dev

MySQL에서 REGEX 사용

분류에서Dev

POSIX 쉘에서 "test"또는 "[" "]"를 사용해야합니까?

분류에서Dev

GNU grep & find -regex : 왜. 정규식에 필요하며 왜 POSIX 문자 클래스를 사용할 수 없습니까?

분류에서Dev

c ++-boost :: posix_time을 사용하여 시간 차이 계산

분류에서Dev

변수 n regex c # 사용

분류에서Dev

posix-threads를 사용하여 thread2가 c에서 thread1을 기다리게하는 방법

분류에서Dev

posix C를 사용하여 세마포어를 동시에 여러 번 폴링

분류에서Dev

RegEx를 사용하여 C #에서 월-일 일치

분류에서Dev

Regex를 사용하여 C #에서 #ifdef 구문 분석

분류에서Dev

C ++에서 regex_match와 함께 PUNICODE_STRING 사용

분류에서Dev

vb.net에서 RegEx 사용

분류에서Dev

Unison에서 Regex 사용 오류

분류에서Dev

파이썬에서 try 및 regex 사용

분류에서Dev

Notepad++, Posix regex, and a URL (regex to get domain)

분류에서Dev

mmap 및 mapfile을 사용하는 Posix-C 프로그램의 분할 오류

분류에서Dev

POSIX에서 스레드를 사용하여 [0,1] 사이의 난수를 생성하는 방법

분류에서Dev

POSIX에서 스레드를 사용하여 [0,1] 사이의 난수를 생성하는 방법

분류에서Dev

정규식 및 POSIX 문자 클래스를 사용하여 R에서 암호 유효성 검사

분류에서Dev

POSIX 도구를 사용하여 파일의 순서를 반대로합니까?

분류에서Dev

Linux 커널 네임 스페이스간에 POSIX 세마포어 사용

분류에서Dev

Text.Regex.Posix에서 정규식 패턴의 길이에 제한이있는 이유는 무엇입니까?

분류에서Dev

C ++에서 std :: regex를 사용하여 정확한 부분 문자열 일치

분류에서Dev

C #에서 richtextbox와 함께 Regex를 사용하는 동안 예외

분류에서Dev

Regex를 사용하여 주식 기호에서 패턴을 추출하는 C #

분류에서Dev

C #에서 Regex를 사용하여 부분 문자열을 얻는 방법

분류에서Dev

Regex C #을 사용하여 텍스트 파일에서 일부 구문 검색

Related 관련 기사

  1. 1

    C에서 POSIX Semaphore를 사용한 다중 스레딩

  2. 2

    사전에서 RegEx 사용

  3. 3

    Posix Semaphore에서 공유 메모리 사용 C에서 대기 및 신호

  4. 4

    MySQL에서 REGEX 사용

  5. 5

    POSIX 쉘에서 "test"또는 "[" "]"를 사용해야합니까?

  6. 6

    GNU grep & find -regex : 왜. 정규식에 필요하며 왜 POSIX 문자 클래스를 사용할 수 없습니까?

  7. 7

    c ++-boost :: posix_time을 사용하여 시간 차이 계산

  8. 8

    변수 n regex c # 사용

  9. 9

    posix-threads를 사용하여 thread2가 c에서 thread1을 기다리게하는 방법

  10. 10

    posix C를 사용하여 세마포어를 동시에 여러 번 폴링

  11. 11

    RegEx를 사용하여 C #에서 월-일 일치

  12. 12

    Regex를 사용하여 C #에서 #ifdef 구문 분석

  13. 13

    C ++에서 regex_match와 함께 PUNICODE_STRING 사용

  14. 14

    vb.net에서 RegEx 사용

  15. 15

    Unison에서 Regex 사용 오류

  16. 16

    파이썬에서 try 및 regex 사용

  17. 17

    Notepad++, Posix regex, and a URL (regex to get domain)

  18. 18

    mmap 및 mapfile을 사용하는 Posix-C 프로그램의 분할 오류

  19. 19

    POSIX에서 스레드를 사용하여 [0,1] 사이의 난수를 생성하는 방법

  20. 20

    POSIX에서 스레드를 사용하여 [0,1] 사이의 난수를 생성하는 방법

  21. 21

    정규식 및 POSIX 문자 클래스를 사용하여 R에서 암호 유효성 검사

  22. 22

    POSIX 도구를 사용하여 파일의 순서를 반대로합니까?

  23. 23

    Linux 커널 네임 스페이스간에 POSIX 세마포어 사용

  24. 24

    Text.Regex.Posix에서 정규식 패턴의 길이에 제한이있는 이유는 무엇입니까?

  25. 25

    C ++에서 std :: regex를 사용하여 정확한 부분 문자열 일치

  26. 26

    C #에서 richtextbox와 함께 Regex를 사용하는 동안 예외

  27. 27

    Regex를 사용하여 주식 기호에서 패턴을 추출하는 C #

  28. 28

    C #에서 Regex를 사용하여 부분 문자열을 얻는 방법

  29. 29

    Regex C #을 사용하여 텍스트 파일에서 일부 구문 검색

뜨겁다태그

보관