2010-12-08 2 views
3

나는 다음과 같은 특성을 가진 파일 경로와 일치하는 정규 표현식을 쓰기 위해 노력하고 있어요 링크 :정규식

  1. /./ 또는
  2. /../ 적어도 중첩되어야를 포함하지 않는 깊은 /tmp/media
  3. 내에서 하나 개의 하위 디렉토리 .log

,477 끝나야합니다 여기

\/tmp\/media\/(?!.*\.?\.\/)+(?:.*\.log) 

내 원하는 결과입니다 (문자열이 일치하지 않는 경우, 내가 만족하지 요건 인용) : 나는 this question을 읽고

/tmp/media/log.log    //NO-MATCH (2) 
/tmp/media/test/log.log  //MATCH 
/tmp/media/../log.log   //NO-MATCH (1) 
/tmp/media/./log.log   //NO-MATCH (1) 
/tmp/media/test/../log.log  //NO-MATCH (1) 
/tmp/media/../test/log.log  //NO-MATCH (1) 
/tmp/media/.t/log.log   //MATCH 
/tmp/media/.../log.log   //MATCH 
/tmp/log.log     //NO-MATCH (2) 
/tmp/media/test/log.notlog  //NO-MATCH (3) 
/tmp/media/test/./log.log  //NO-MATCH (1) 

를내가 지금까지 무엇을 가지고 , 그리고 성공적으로 답변을 구현했지만, /tmp/media/log.log는 내가 원하지 않을 때도 여전히 일치합니다. /media/log.log 사이의 빈 문자열이 어떻게 든 (?!.*\.?\.\/)을 만족시키기 때문입니다.

누구든지 내가 뭘 잘못하고 설명 할 수있게 도와 줄 수 있습니까?

답변

1

이 작업을 시도 할 수 있습니다 :

^(?![^.]*\/\.\.?\/)\/tmp\/media\/(?:[^\/]+)*\/\w+\.log$ 

rubular link

+0

이것은 또한'/ tmp/media // log.log'와 일치하는 것으로 보입니다. 필자의 요구 사항에서 지정하지 않았지만 합법적 인 파일 경로만을 원한다고 언급 했어야합니다. –

+3

'/ tmp/media // log.log'는 실제로 합법입니다 - http://unix.stackexchange.com/questions/1910/how-linux-handles-multiple-path-separators-home- username-file –

+0

아, 지적 해 주셔서 고마워요. 직관은 그렇지 않다라고 말했다 : –

1

정규 표현식이 필요한가요? 제공된 링크에서 제안 된대로 readlink를 사용할 수 있습니다. 또한 다른 제약 조건에 대한 정규식 일치를 수행하기 전에 /.//../을 확인하는 것이 더 쉬울 것입니다. 코드를보다 명확하게 만듭니다.

+0

좋은 지적입니다 ... 내 인생을 더 쉽게 만들었을 것입니다. –

1

당신은 정말 먼저 경로를 시성한다. 이렇게하면 ... 디렉토리가 정규식 자체에서 차단되지 않습니다. 당신이 그 일을하면, 정규식이된다 :

\/tmp\/media\/[^\/]+\/.*\.log 

당신이 프로그래밍하는 언어를 모른 채, 나는 경로 시성 메커니즘을 제안 할 수 없습니다.

+0

나는 이것을 Qt에서 사용하고있다. 기본적으로 사용자가/tmp/media에서 디렉토리를 탐색하지 못하게하기 위해 고안된 파일 브라우저보기를 초기화합니다. –

+0

@burpen : Qt는 프로그래밍 언어가 아닙니다. – cdhowie

+0

좋습니다, 머리카락을 나눌 때 C++입니다. 그러나 Qt의 QRegExp 클래스를 사용하고 있습니다 : http://doc.trolltech.com/4.7/qregexp.html –