실제로 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(®exCompiled, regexString, REG_EXTENDED))
{
printf("Could not compile regular expression.\n");
return 1;
};
m = 0;
cursor = source;
for (m = 0; m < maxMatches; m ++)
{
if (regexec(®exCompiled, 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(®exCompiled);
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
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] 삭제
몇 마디 만하겠습니다