2012-12-18 3 views
0

내 PowerShell 코드에 사용자가 입력 한 문자열을 삽입하는 것을 피할 수있는 경우가 있습니다. 내가 코드를 올바르게 이스케이프 (각각의 인용문을 복제하고, 작은 따옴표로 묶인 문자열을 가진 powershell은 똑똑한 따옴표를 포함하여 5 개의 다른 따옴표 문자를 받아 들인다. 이제는 받아 들일 것이라고 가정하자. 내가 뭘하고 싶은지는 나 문자열이 제대로 이스케이프, 다음과 같이 그렇게 문자열을 따옴표를 두 배로하면됩니다 이스케이프 여부를DOTNET REGEX로 이스케이프 된 따옴표를 올바르게 일치 시키십시오.

hello ' there 

hello '' there 

그러나 3 따옴표 안전하면서 나쁜 (또는 5 영형 R 7 등) 그래서

hello ''' there 

는 점에서 더 홀수 작은 따옴표가없는, 또한 내가 문자열 이스케이프 제대로되었는지 확인할 수있는 정규식을 찾기 위해 노력하고있어 너무

위험 또한 나쁜 패턴.

표준 정규식 계산 그룹과 같은 것은 가능하지 않지만 dotnet 캡처 그룹을 사용하면 이런 식으로 작업하기를 바란다.

('\b(?<DEPTH>)|\b'(?<-DEPTH>)|[^']*)*(?(DEPTH)(?!)) 

하지만 제대로 작동하지 않습니다.

단순히 ''이 가진 '한 대체하지 왜

답변

6

그냥 당신을 왜냐하면, @klumsy :

"(?ix:     # ignore whitespace and comments 
    ^    # start at the beginning 
    (?(D)    # if 'D' is defined... 
     (?<-D>')  # match a quote and undefine D 
     |    # otherwise 
     (?: 
      (?<D>') # match a quote and define D 
      | 
      [^']  # or match anything else 
      ) 
    )+     # as many times as we can 
    (?(D)    # if 'D' is STILL defined... 
     ($!)   # then don't match 
     |    # otherwise 
     [^']*   # match anything except ' 
    )$     # all the way to the end 
)" 

이 항상 쌍 따옴표가있는 경우에만 그 문자열을 일치를 작은 따옴표 또는 홀수 개의 따옴표 '' '가 나타나는 문자열은 제외됩니다. 내가 아는 한. NET 정규식에서만 작동합니다.

모든 공백과 주석을 제거하는 한 처음과 마지막 줄을 생략 할 수 있습니다.

+0

이 정규식은 두렵고 아름답습니다. 그리고 그것은 작동합니다! – klumsy

+0

여기에 압축 된 버전 ^ (? (D) (? <-D> ') | (? ') | [^ '])) ($!) | [^'] *) $ – klumsy

0

:

> $a = read-host 
foo ' bar 
> $a 
foo ' bar 
> $a -replace "'","''" 
foo '' bar 
+0

이미 입력 코드를 위생적으로 처리 할 수있는 광범위한 코드가 있습니다. 그러나이 상황에서 나는 presanitize 기회가 없으며 REGEX를 기반으로 필터를 필터링 할 수있는 기능 만 가지고 있습니다. 정규식을 지나면 코드에 직접 주입됩니다. – klumsy

관련 문제