2013-03-01 3 views
2

PowerShell에서 정규 표현식을 만드는 중입니다. 이것은 VS2012에서 postbuild 이벤트를 시작하여 sql을 변환하여 테이블 이름과 열 이름에 공백이 없어야합니다. 이 작업이 끝나면 파일 내용을 정규식 문자열로 대체해야하는 스크립트를 수정할 수 있습니다. 나는 this tutorial과 함께 일해 왔지만, 열린 공간과 닫힌 영역 사이에 공백이 있으면 밑줄로 스페이스 (\ s)를 대체 할 수 없습니다. 내가 PowerShell을 ISE에서이 스크립트를 실행하면대괄호 안에있는 문자에 대한 정규 표현

select * from [Existing_product] where [Existing_product].[Desc_value] = 26 

:

변환 :

select * from [Existing product] where [Existing product].[Desc value] = 26 

여기

내가 SQL을 변환하고 싶습니다 방법의 예

#Example of PowerShell Regex Replace 
$newline = ' 
' 
$strText = 'select * from [Existing product] where [Existing product].[Desc value] = 26' 
$Pattern = '(?<=\[)(\s(?<=\s))(?=\])' 
$New = "_" 
$newline 
'SourceText: ' 
$strText 
$newline 
$strReplace = [regex]::replace($strText, $pattern, "$New") 
"We will now replace $Pattern with $New :" 
$newline 
$strReplace 

이 결과를 얻으십시오 :

PS C:\> C:\REGEX.ps1 

SourceText: 
select * from [Existing product] where [Existing product].[Description value] = 26 


We will now replace (?<=\[)(\s(?<=\s))(?=\]) with _ : 


select * from [Existing product] where [Existing product].[Description value] = 26 

여기서 공백이있는 문자열이 위의 밑줄로 바뀌길 원합니다.

내 정규식은 현재 (?<=\[)(\s(?<=\s))(?=\])이지만 분명히 대괄호가 바로 옆에있는 공백 만 선택합니다. 위의 정규식에서 무엇을 놓치고 있습니까?

질문이나 도움이 필요하시면 알려주세요.

답변

3

예, 패딩을 추가하지 않으면 정확한 일치 항목 만 선택됩니다.

(?<=\[.*?)(\s(?<=\s))(?=.*?\])이 이미 당신을 대신합니다. 하지만 일반적으로 정규 표현식은 A) 지나치게 복잡하고 B) 정규 표현식이이 작업에 적합한 도구는 아닙니다.

정규 표현식이 일반적으로 작동하지 않을 것이라고 생각합니다. 어떻게이 같은 문자열에 대해 :

[a] [b] 

나는,이
[a]_[b] 

어쩌면 (?<=\[[^\]]*?)(\s(?<=\s))(?=[^\[]*?\]) 작품

로 전환 될 것으로 예상 어쩌면 그것은하지 않습니다 - 그것은 엉망 중 하나의 방법입니다!

모든 \[([^\]]*)\] 그룹을 추출한 다음 두 번째 단계로 다시 작성해야합니다.

SQL은 아마도 이 아니며 일반 언어가 아닌이지만 컨텍스트는 없습니다.

+0

감사에서! 예, 두 번째 옵션 인'(? <= \ [[^ \]] *?) (\ s (? <= \ s)) (? = [^ \]]? \])' 내가 뭘 찾고 있었는지. 다시 한 번 감사드립니다! –

+0

대괄호 사이에 여러 공백으로 테스트를 해봤습니다. –

+0

아직 해킹입니다. 나는 정규 표현식이 모든 것을 자르기 위해 사용해야하는 "스위스 육군의 전기 톱"이라고 생각하지 않습니다. –

2

이 작동하는 것 같다 (촘스키 계층 구조를 참조하십시오) :

$string = 'select * from [Existing product] where [Existing product].[Desc value] = 26' 

$string -replace '(\[\S+)\s(\S+\])','$1_$2' 

선택 * [Existing_product]의 경우 [Existing_product] [Desc_value] = (26)이 두 개 이상있을 경우 더 복잡해진다

. 임베디드 공간.

$string = 'select * from [Existing product one] where [Existing product one].[Desc value] = 26' 

[regex]$regex = '(\[[^\]]*\])' 

$regex.Matches($string) | 
%{$string = $string -replace [regex]::escape($_.value),($_.value.replace(' ','_'))} 
$string 

선택 * [Existing_product_one] 여기서 [Existing_product_one]. 당신의 게시물에 대한 [Desc_value] = 26 개

+0

나는 이것을 작동시킬 수 있었다! 나는 새로운 정규 표현식을 사용할 수 없기 때문에 다른 솔루션을 사용할 것이다. 그래도 포스트에 감사드립니다! –