2013-11-25 5 views
0

아주 간단한 문자열에서 일치 항목을 가져 오려고합니다. 내 입력 문자열에서, 일반적인 패턴은 간다 : s(definitely a number)e(maybe some characters)s...대조 정규식 비어있는 일치

예 입력 : s1e1s2e2s3es4e4

예상 일치 배열 : 나는 시도 [{1,1},{2,2},{3,''},{4,4}]

:

/s(\d)e([\d\:]+)?/g 정말 가까운 [{1,1},{2,2},{3},{4,4}]를 얻을 수를하지만, 세 번째 그룹에 빈 문자열이 필요합니다.

나는 순진하게도 차라리 첫 번째 예에서 문자 클래스를 사용하는 대신 모든 문자와 일치하는 정규 표현식을 말할 것 나에게 [{1,''},{2,''},{3,''},{4,''}]

을 제공

/s(\d)e(.*?)?/g을 시도합니다.

단순한 작업 솔루션 외에도 오해에 대한 설명도 훌륭합니다.

+0

어떤 언어입니까? – Barmar

+0

preg_match_all()을 사용하여 PHP에서 이것을 수행하지만 regex101.com에서 정규 표현식을 테스트하고 있습니다. –

+0

'preg_match_all '을 사용하여 예상대로 작동하고,'g '수정자를 제거해야했습니다. – Barmar

답변

1

이 시도 :

$pattern = '~s(\d)e([\d\:]*?(?=s\d|:|$))~'; 

은 이제 캡처 그룹이 빈 문자열과 일치하지 않으며 더 이상 선택 사항입니다 수 있습니다.

다른 "s \ d"또는 : 또는 문자열의 끝 부분이 있는지 확인하기 위해 미리보기를 추가했습니다.

편집 : "S"가 두 번째 캡처 그룹에 허용되지 않기 때문에, 당신은 간단하게 작성할 수 있습니다

$pattern = '~s(\d)e([^s]*)~'; 
+0

아, 너무 간단합니다. 나는 'e'다음에 똑같은 것을 할 수 있지만 문자 클래스가 없기 때문에 아무것도 찾지 않거나 빈 문자열이 다음 문자와 일치 할 때까지 일치시킬 수 있습니까? –

+1

's'를 제외한 모든 문자와 일치하는 문자 클래스를 사용하십시오 :'[^ s] *' – Barmar

+0

@ parker.sikand : Barmar가 답변을 가지고 있습니다. 게시물에 편집을 추가 할 것입니다. –

2

PREG_PATTERN_ORDER 옵션 (기본값)을 사용 preg_match_all. 그런 다음 결과에서 어떤 것도 일치하지 않는 선택적 그룹을 생략하지 않습니다.

+0

다른 답을 올바른 것으로 표시하는 것은 일반적인 정규식 수준에서 문제를 해결했기 때문입니다. 이는 내가 질문을 제기 한 방식입니다. 그러나,이 PHP는 특정 정보는 매우 유용합니다. –

0

나는이 s(\d)e(\d|)이 예제에서 작동해야한다고 생각합니다. 콜론이 무엇인지 모르겠습니다.