2012-05-29 2 views
3

나는 같은 문자열을했습니다이 :C의 정규 표현식 앞서 부정적인 모습

"result is abcdefg hij!klm </td" (또는 다른 대신 ABCD의 모든 것을 ...)

나는이 만든 정규식은 다음과 같습니다
"result is ([^<]+) </td"

결과가 발견되어 잘 작동합니다. 하지만 문자열이 :
"result is not found </td"
... "찾을 수 없음"이라는 단어를 추출하지 않도록하려면 어떻게해야합니까?

음수의 미리보기 표현이 있지만 C99의 regex.h에서는 작동하지 않는다는 것을 알고있었습니다.

  • "(?!not found)" -> 나쁜 정규식
  • "([^n][^o][^t][^ ][^f]..)" -> 예를 들어, "지금"일치하지 않는
  • "(([^<]+)&(!not found))" -> 나쁜 정규식

(거기에는 '&'연산자 없다 , 나는 해결책이 다음과 같을 것이라고 생각한다 : a&&b == !a||!b)

--EDIT--
여기에서는 정규식을 계산하는 코드의 일부입니다.

pmatch=malloc(nmatch*sizeof(regmatch_t)); 

printf("regex: %s\n",patrn); 

if (regcomp(&rgT,patrn,REG_EXTENDED | REG_NEWLINE) != 0) 
{ 
    snprintf(globals.err_buff,MAX_BUFF,"bad regex: \"%s\"",patrn); 
    w_report_error(globals.err_buff,__FILE__,__LINE__,__func__,0,0,error); 
    return EXIT_FAILURE; 
} 
- 편집 -
어쩌면 내가 해결책을 발견 :
내 자신의 정규식 기능은 그것을 숫자 매개 변수로> 0을 전달하면 N 번째의 역 참조를 반환, 그래서 ...
참고 : ./regex은 argv [...]를 내 자신의 라이브러리의 w_regexp로 리디렉션하는 C 프로그램 일뿐입니다.

$ ./regex "result is crack </td" 'result is (not found) </td|result is ([^<]+) </td' 3 
regex: result is (not found) </td|result is ([^<]+) </td 
"crack" 
"" 
"result is crack </td" 
$ ./regex "result is not found </td" 'result is (not found) </td|result is ([^<]+) </td' 3 
regex: result is (not found) </td|result is ([^<]+) </td 
"" 
"not found" 
"result is not found </td" 

그래서, 나는 그 AA 해결책이 될 수있는 데이터를 추출하는 데 사용할 역 참조의 인덱스를 의미 내 구조체에 번호를 추가 생각하지만, 난 또 다른 일이에 더 나은 방법을 기다리고 있습니다 또는 2.
미리 감사드립니다.

- EDIT-- (너무 많은 시간 :))
작동합니다! 나는 추종자를 피하고자하는 문자열을 '|' 정확한 문자열을위한 패턴.
이것은 정규식입니다.
"result is not found </td|result is ([^<]+) </td"
다시 한 번 감사드립니다.

답변

0

아마도 "result is (?:not found)?([^<]+)</td"과 같은 것일까요?

+0

나쁜 정규식 .... 나는 look-ahead가 C99 regex.h에서 지원되지 않는다고 생각한다. –

0

Aztaroth의 작품도 너무 result is ((?!not found)[^<]+) </td입니다. 차이점은 그의 레지스터가 공백으로 일치한다는 것입니다. 내 것은 일치를 등록하지 않습니다.

result is abcdefg hij!klm </td 
result is not found </td 
result is not this </td 
result is note this </td 
result is ote this </td 

편집과 테스트 : 수치 확인 -이 게으른 비트 윽하지만 어떻게 정규식 두 개의 패스에 대해 무엇입니까? 첫 번째는 '찾을 수 없음'이라는 일치 항목을 확인합니다 result is (not found) </td.그런 다음 일치하지 않는 원본 정규식을 사용하여 결과를 제거합니다.

+0

나쁜 정규식 .... 나는 C99 regex.h에서 look-ahead가 지원되지 않는다고 생각한다. .. –

+0

네, 생각했습니다,하지만이 구조체는 수십 시간 (동적 목록) 사용되므로 모든 구조체에 하나의 패턴이 추가되고 수십 개의 문자열을 구문 분석해야합니다. 모든 구조체, 모든 하나의 특정 사건에 대해서만 ..... 나는 더 좋은 해결책이 ..... 있기를 바랍니다. –