2016-08-11 2 views
2

나는 파일 이름 문자열로 가득 찬 열이있는 테이블을 가지고 있습니다. 파일 이름이 다른 형식으로 제공 :Matlab regexp; 두 표현 중 하나에 대한 둘러보기

str ={... 
'filename',... 
'filename_suffix',... 
'filenamesuffix'}; 

내가 코드를 사용하여 각 파일 이름의 접미사 부분을 추출 regexp를 사용 (접미사없이 하나 ''를 수신)하기 위해 노력하고있어 (있음을 유의 접미사 문자의 집합을 포함 밑줄) 일 수있다 : 불행히도

regexp(str,'(?<=filename(_|)).*','match','emptymatch') 

이것은)의 출력 셀 확산 후 (나에게 출력을 제공한다 :

,787 filename_ 일치하도록 시도하고 발견되지 않는 경우는 시도는 filename 일치하지만 분명히 내가 그 라인을 오해 한 것으로 이해 filename(_|)를 작성할 때 내가 기대하는 것처럼

구체적으로는 두 번째 접미사에 _을 무시하지 않습니다 .

아무도 중 하나를 사용하여 둘러보기를 달성 할 수 있습니까?

답변

3

우선, Matlab 정규식, lookbehind는 대체 브랜치 안에 번갈아 가질 수 없습니다.

(?<=filename_|filename) lookbehind는 filename_ 또는 filename A는 줄 바꿈 ( .*) 이외의 0+ 문자에 출석해야합니다 중 하나

regexp(str,'(?<=filename_|filename).*','match','emptymatch') 
      ^^^^^^^^^^^^^^^^^^^^^^^ 

로 패턴을 확장합니다. * 그러나, 둘러보기는 텍스트를 소비하지 않고 확인합니다. 일치하기 바로 전에 filename 또는 filename_을 허용합니다. 그래서 엔진은 왼쪽의 문자 하나를 하나씩 검사하고, 일단 filename과 같으면 나머지와 일치시킵니다.

방금 ​​_없이 접미사를해야하는 경우에는 다음 방법 중 하나를 사용할 수 있습니다 다음 lookbehind이 경기를 실패 내다 (?!_)와 결합

ntoks = regexp(str, '(?<=filename_|filename)(?!_).*', 'match','emptymatch'); 

현재 후 _가있는 경우를 위치 (즉 filename__sometext 경우 일치가 없을 것 수단), 또는

_? 정량으로 선택된다
ntoks = regexp(str, 'filename_?(.*)', 'tokens','emptymatch'); 

.

캡처 된 부분을 얻으려면 'match'이 아니라 'tokens'을 사용해야합니다. Tokens in Regular Expressions을 참조하십시오.

적은 계산 시간과 또 다른 방법은 outkey tokens 대신 캡처 그룹을 사용하여 얻을 수있는 demo

+0

이것은 생각했지만'filename _? (. *) ''은 여전히 ​​전체 문자열과 일치합니다 (즉,'filename'을 벗어나지 않습니다.) – Dan

+0

* 캡처 된 부분을 가져와야합니다 –

+1

이렇게하려면'match' 대신에'tokens'를 사용해야합니다. 예를 들어 제 대답을보십시오 – Skogsv

3

를 참조하십시오

str ={'filename','filename_suffix','filenamesuffix'}; 

result=regexp(str,'filename_?(.*)','tokens','emptymatch','once'); 

celldisp(result) 

참고 : 나는 각 셀부터 'once' 옵션을 추가 cellstring은 하나의 파일 이름을 가지고있는 것으로 보입니다. 제거하도록 선택한 경우 결과는 셀 배열의 셀 배열이됩니다.

관련 문제