2014-09-02 3 views
0

나는 powershell에서 regex를 이해하는 데 어려움을 겪고 있습니다. 금요일 사용자에 마이크-Z는이 같은 명명 규칙과 폴더의 그룹에서 번호를 추출하는 스크립트 나를 도와 -powershell 정규식 캡처 버전 번호

Core_1.1.2 
Core_1.3.4 

다음 정규식;

-replace '.*_(\d+(\.\d+){1,3})', '$1') 

은 숫자 (예 : "1.1.2") 만 추출 할 때 완벽하게 작동합니다.

불행히도 몇 가지 폴더 이름에 버전 번호를 뒤 따르는 다른 정크 텍스트 (예 : Core_1.2.4_Prod)가 있다는 것을 알았습니다. 나는 위의 정규 표현식을 꼬집어 꼬리말 텍스트를 무시하도록 노력했지만 너무 멀지 않았다. 나는 다양한 온라인 정규식 생성기뿐만 아니라 내 자신의 제한된 정규식 경험을 사용했지만 어디에도 가지 않았다. 내가 내가 필요한 텍스트를 캡처해야 regexes을 생성 할 수 있지만 그들은 powershell에서 작동하지 않았다. Converesely, 위의 작업 정규식 (powershell에서 작동하는 것처럼) 내가 사용한 정규식 도구에서 실패합니다.

기본적으로, 난 그냥 버전 번호를 캡처해야이

Core_1.1.2 
Core_1.2.4_Prod 
Core_1.2.6 
Core_1.3.1_Prod 
Core_1.4.4 

같은 폴더 이름의 목록을 제공. 또한, 내가 왜 PS 정규 표현식에 의해 상당히 혼란 스러울 때이 정규 표현식이 작동하는지 설명 할 수 있다면 크게 감사 할 것입니다.

답변

3

당신은 모든 언어의 기능을 대체 기본적으로 패턴의 마지막에

.*_(\d+(\.\d+){1,3}).* 

그래서 코드가 될 것이다,

-replace '.*_(\d+(\.\d+){1,3}).*', '$1') 

DEMO

.*를 추가해야 일치하는 문자 만 바꿔야합니다. 정규 표현식 .*_(\d+(\.\d+){1,3})은 버전 번호의 마지막 숫자와 일치합니다. 나머지 부분은 일치하지 않습니다. 따라서 일치하는 문자를 $1으로 바꿀 때마다 후행 부분이 일치하지 않기 때문에 첫 번째 캡처 그룹 내의 문자와 함께 후행 부분 _Prod을 인쇄해야합니다. 전체 줄을 $1 (즉, 버전 번호)으로 바꾸려면 뒤쪽 부분을 일치 시키면됩니다.

+0

데모 사이트에서 정규식의 마지막'. *'을 제거하면됩니다. 차이점을 확인해야합니다. –

+0

굉장하고, 완벽하게 작동 할뿐만 아니라, 내가 시도한 것이 작동하지 않는 이유를 이해하도록 도울 수있었습니다. –

+0

왜냐하면 '이 점에서 PS 정규 표현식이 극도로 혼란 스럽기 때문에 정규식이 왜 작동하는지 설명 할 수 있다면 크게 감사 할 것입니다.'라고 설명하는 것이 좋습니다. –