2011-02-04 6 views
1

문자열에서 두 번째로 지난 밑줄 후 모든 캐릭터를 얻기 위해 두 번째 - 마지막으로 밑줄 후 모든 숫자를 grep을하는이 정규식은 어떻게 보여야정규식 내가 원하는

Input        Output 
PART1_PART2_PART3_G2010   PART3_G2010 

에게 어떤 생각을 수행 할 수있는 방법 어떤 아이디어 like

+1

제목과 일관성없는 질문. 제목에서 마지막으로 바람직하지 않은 부분 뒤에 오는 모든 숫자를 원하지만 질문에서 두 번째 밑줄 뒤에있는 모든 것을 원합니다. 마음을 정하십시오! :) –

+0

아니요, 그녀는 두 번째 마지막 밑줄 뒤에 모든 것을 원한다고 말했습니다. 이것이 처음부터 계산 된 두 번째 것임을 말하면이 예에서는 동일하지만 임의 입력에 대해서는 틀린 경우입니다. – leemes

답변

4

입력 내용에 밑줄이 3 개인 경우 Andrea Spadaccini의 답변이 작동합니다. 문제는 그 전에 와서 얼마나 많은 밑줄의 두 번째 밑줄 독립 후 모든 참조, 더 일반적으로 의미하는 경우, 정규 표현식은 끝이 같은 ($)에서 검색 할 필요가 :

_([^_]*_[^_]*)$ 
+0

이 정규식을 설명해 주시겠습니까 – lisa

+1

. [^ _] *는 밑줄이 아닌 문자의 모든 문자열과 일치합니다. 따라서 정규 표현식은 입력 끝에 _A_B 형식의 문자열을 일치시킵니다. 여기서 A와 B는 밑줄이 아닌 문자의 문자열입니다. 이를 통해 정규 표현식의 첫 번째 밑줄이 입력의 두 번째 마지막 밑줄이됩니다. 그런 다음 괄호는 필요한 모든 밑줄을 선택합니다. – joriki

1

첫 번째 N 밑줄이 아닌 밑줄. 반복. 마지막 문자를 그룹화하십시오. 안드레아 Spadaccini의 정규식처럼

[^_]*_[^_]*_(.*) 
+0

처음부터 두 번째 밑줄 뒤에 오는 모든 것을 캡처합니다. 예제에서 이것은 동일하지만 임의의 입력에 대해서는 그렇지 않습니다. – leemes

6
.*_([^_]*_[^_]*)$ 

는 밑줄 사이 부분의 특정 총 개수에 바인딩되지 않습니다.

+0

죄송합니다.이 정규 표현식을 설명해주십시오. – lisa

+2

첫 번째 두 기호'. * '는 모든 문자를 캡처하므로'.'는 임의의 문자 하나를 캡처하고 '*'는 '가능한 한 많이'에 대한 수량 기호입니다. 그런 다음 밑줄이 나타납니다. 대괄호 안의 표현식은 밑줄 사이의 두 부분을 캡처해야합니다. 처음에는 모든 밑줄 문자를 다시 캡처합니다. 이것은 대괄호를 사용하고'(^') 밑줄 =>'[^ _]'을 제외한 모든 문자를 원한다고 말합니다. 가장 마지막 기호'$'는 입력 문자열의 끝을 정의합니다. 이 부분을 처음부터'. *'로 남겨 두는 것이 가능하다고 생각합니다. – leemes

관련 문제