2013-07-14 6 views
1

를 사용하여 낙타 표기법을 감지하는 방법은 낙타 표기법 경계를 감지하는 PowerShell에서 방법이 있나요 그들이 ArtistTitle파워 쉘

로 끝날 것을 ArtistTitle 그래서 형태에있는 노래 이름을 분할 싶습니다 교체를 수행할까요? 이는 첫 번째 사례 경계에만 영향을주고 나머지는 무시해야합니다.

당신은, 바로 어떤 대문자 문자 앞에 문자열을 분할 민감한 정규 표현식 케이스를 사용하는 빈 요소를 제거하고 대시로 남아 무엇을 가입 할 수 있습니다

답변

4

:

PS> 'ArtistTitle' -csplit '(?=[A-Z])' -ne '' -join '-' 
Artist-Title 

단지 첫 번째 단어를 분할하려면 사용 반환 된 하위 문자열의 최대 개수를 지정하는 Split 연산자의 두 번째 매개 변수 (Max-substrings)입니다. 자세한 내용은 about_Split 도움말 항목을 참조하십시오

PS> 'ArtistVeryLongAlbumTitle' -csplit '(?=[A-Z])',3 -ne '' -join '-' 
Artist-VeryLongAlbumTitle 

UPDATE을 : 나는 그것이 첫 번째 경우 대문자 문자를 분할하지 않는 정규식 패턴을 사용하여 명령 단축을 할 수 있었다 (상기 문자열의 시작 부분) 빈 항목이 만들어지지 않습니다.

PS> 'ArtistVeryLongAlbumTitle' -csplit '(?<!^)(?=[A-Z])',2 -join '-' 
Artist-VeryLongAlbumTitle 
+0

이 매우 간결하다. 첫 번째 사건에서만 어떻게 작동하는지 어떻게 확신합니까? 예. 'ArtistTitleAlbum' – KalenGi

+0

내 대답 편집, 시도해보기 –

+0

이러한 정규 표현식에서는 대문자에'\ p {Lu} '구문을 사용하는 것이 좋습니다 (소문자의 경우 \ p {Ll}). 이 방법은 다른 문화에도 효과적입니다. –

0

나는 그것을하는 루머를 만들어 냈습니다. 이 코드는 파일 이름을 검색하고 ArtistTitle 경계를 검색하며 아티스트와 제목 사이에 하이픈으로 파일 이름을 바꿉니다.

ls | foreach { $result = ($_.Name -cmatch '^(\w*?[a-z])([A-Z])'); $search = "$($matches[1])$($matches[2])"; $replace = "$($matches[1]) - $($matches[2])"; Rename-Item $_ -NewName ($_.Name -replace $search, $replace) } 

UPDATE : 결과 명령이 훨씬 짧은

, 설립 셰이 레비의 대답 :

ls | foreach -Process { Rename-Item $_ -NewName ($_.Name -csplit '(?<!^)(?=[A-Z])',2 -join ' - ')}