2016-10-09 7 views
0

내 정규식은 지금까지입니다 :정규식은 두 번째 캡처 그룹에서 제외 할

^(UCX_|UBX_|USP_)([A-Za-z0-9]\w+)(_\d+)?$ 

내가 문자열을 테스트 할 때 :

UCX_1maxi_holiday2_blah_343 

제대로 테스트를 진정한 그러나 마지막 캡처 그룹 것 두 번째 그룹과도 일치하기 때문에 절대 도달하지 못합니다. 즉 마지막으로 구분 된 섹션이 모두 숫자 인 경우 두 번째가 아닌 세 번째 캡처 그룹에서 해당 섹션을 원합니다. 다른 사람들은 제 2 그룹에서 그것을 원합니다.

나는 lookaheads와 -behinds를 생각해 보았고 나는 이것들을 위해 작동한다고 생각하지 않지만 놀랄 수 있습니다.

나는 문자열의 끝을 검사하기 위해 별도의 테스트를 수행 한 다음 필요로하는 문자열을 분리하지만 지적 호기심을 가질 수 있습니다. 이

사람이 몇 가지 정규식 JiuJitsu을 가지고 모든 숫자를인지 끝을 건드리지을 중지 두 번째 캡처 그룹을 수정하는 방법이 있는지

궁금하네요?

답변

1

두 번째 캡처를 비 욕심 많은 것으로 변경하면 원하는 것을 얻을 수 있습니다. 사용 :

^(UCX_|UBX_|USP_)([A-Za-z0-9]\w+?)(_\d+)?$ 
+0

그래도 작동합니다. nongreedy에 대한 나의 초기 이해에는 약간의 교육이 필요합니다. 그래서 욕심이 없다는 것은 다음 패턴이 그것을 안다면 먹는 것을 계속할 것입니까? – jollarvia

+0

일반적으로 그렇습니다. 탐욕스러운 표현은 대개 더 빠릅니다. 욕심이없는 성냥은 앞이나 뒤를 돌아봐야하기 때문입니다 (패턴의 다음 부분을 위해 떠날 필요가있는 것을 '알기'위해). 많은 경우에 속도 차이는 결코 중요하지 않습니다. – cco

0

당신은 그 일을 간단하게 할 수 있습니다

^(UCX_|UBX_|USP_)(\w+?)(_\d+)?$ 

\w 문자가 _ (밑줄) 문자를 포함 A-Z, A-Z, 0-9,에서 문자입니다.

+0

Marcel에게 감사 드려요.하지만 마지막에 숫자 그룹이 필요합니다. 선택 사항으로 만들려고 노력하고 있습니다. – jollarvia

+0

@jollarvia. 나는 대답을 업데이트했다. –

+0

다른 정규식 변형 : ['^ (U (? : [BC] X | SP) _) ((?! _) \ w +?) (_ \ d +)? $'] (https://regex101.com/ r/EdF7X2/1) –

관련 문제