2013-04-25 2 views
0

I, 즉 텍스트 파일의 라인 처리하는 동안, C에서 일부 정규식 물건을 실험 하였다불일치

MY NAME IS ;;JOHN 

내가 sscanf을 사용했다 및 sscanf에서의 형식으로 %s %s %s %[^;]와 일치 매개 변수. 내가 Rubular와이를 테스트 할 때 (즉, 나는 "당신의 정규 표현식"의 [^;] 입력 "당신의 테스트 문자열 :"필드와 ;;test 필드 "), 그것은 test 데이터와 일치

을하지만. 라인

sscanf("MY NAME IS ;;JOHN", "%s %s %s %[^;], str1, str2, str3, str4)

네 번째 문자열 str4 사실. 즉, sscanf 반환 3. 내 지식, 세미콜론 이외의 문자와 일치 [^;] 정규식으로 , 왜 그렇게 일치하지 않습니다 그렇다면 sscanf이 (가) ;;JOHN에 일치하지 않는 것 같습니까?

그냥 sscanf의 문제입니까? 아니면 glibc가 어떤 이유로 정규 표현식을 다르게합니까? sscanf이 문자열의 첫 번째 문자가 실제로 세미콜론이므로 네 번째 문자열과 일치하지 않으므로 문자열과 정확히 일치하지 않을 수 있습니까? 왜 그것이 3을 반환하는 것입니까?

: 나는 MY NAME IS DOE;;JOHN 같은 라인을 가지고 sscanf를 사용하는 경우

또한, 함수 4. 여기에

+0

'scanf' 함수는 완전한 정규식 일치를 수행하지 않습니다. –

+0

글쎄, glibc는 정규식을 지원하지만, "full"정규식이없는 scanf는 무엇을 의미합니까? – lu6cifer

+2

'scanf '의 형식은 정규 표현식이 아닙니다. "문자 클래스"구문은 정규식과 유사하지만 정규식이 아닙니다. –

답변

2

the manual page for sscanf() 정규 표현식에 대해 말하는 것을 볼 반환하지 분명히하기 위해 위의 인용문은 "regular"라는 단어가 매뉴얼 페이지에 나타나지 않기 때문에 비어있다. 이는 sscanf() 및 친구들과 함께 사용되는 패턴이 이 아니고 정규식이기 때문입니다. 당신은 그 (것)들이이기 위하여 예기 해 보인다, 혼란을 창조한다.

구문 %[] 좋아해서 설명하는 문자 범위 :

[ 허용 지정된 문자 세트의 문자의 비어 있지 않은 서열 일치; 다음 포인터는 char에 대한 포인터 여야하며 문자열의 모든 문자에 대해 충분한 공간이 있어야하고 더하기 null 바이트가 있어야합니다.

일반적인 공백 건너 뛰기가 억제됩니다. 캐릭터 라인은 특정 세트 (또는 세트) 안의 문자로 구성됩니다. 집합은 열린 대괄호 [문자와 닫는 대괄호] 문자 사이의 문자로 정의됩니다.

열린 대괄호 뒤의 첫 문자가 곡절 기호 (^) 인 경우 집합에서 해당 문자를 제외합니다. 세트에 닫기 괄호를 포함하려면 괄호 또는 서 컴 플렉스 뒤에 첫 번째 문자로 만드십시오. 다른 위치는 세트를 종료합니다.

하이픈 문자 - 또한 특수 문자입니다. 두 개의 다른 문자 사이에 놓이면 모든 개입 문자가 세트에 추가됩니다. 하이픈을 포함하려면 마지막 닫는 대괄호 앞에 마지막 문자로 지정하십시오.예를 들어 [^] 0-9-]는 "대괄호, 0-9, 하이픈"을 제외한 모든 것을 의미합니다. 문자열은 (또는 곡절 기호가있는) 문자가 아닌 문자 모양으로 끝나거나 필드 너비가 떨어지면 끝납니다.

+0

게시 한 sscanf의 맨 페이지를 기반으로'% [^;]'는 세미콜론이없는 문자열을 찾지 만'MY NAME IS ;; JOHN'에서 찾을 수 없기 때문에 sscanf는 3 개의 문자열 만 일치시킵니다 4 대신에? 그렇다면 왜 '내 이름은 DOE입니까?', 존 (John)은 세미콜론이 있더라도 성냥을 받게되는 이유는 무엇입니까? (즉, sscanf가 후자의 문자열에 대해 4를 반환하는 이유는 무엇입니까?) – lu6cifer

+0

'MY NAME IS DOE ;; JOHN'은 세미콜론이 문자열의 일부가 될 수 있고'sscanf()'가 "앞을 향하지"않기 때문에 일치합니다 다음 패턴이므로'DOE'에서 세번째'% s '에 대한 일치를 시작하는 동안 다음 패턴이 세미콜론을 배제한다는 사실을 염려하지 않으므로 단일 문자열은 DOE ;; JOHN 모두와 일치합니다. – unwind

+0

@unwind : 마지막 토큰은'DOE'뿐입니다. ';'는 문자 범위 구문 때문에 읽히지 않습니다. http://ideone.com/yVH1bK – nhahtdh