2012-10-02 2 views
0

정규식을 사용하여 MDX 멤버 참조를 이스케이프 처리하지 못했습니다.외부 대괄호 안에 오른쪽 대괄호를 바꾸는 정규식

[dim[e]]nsion].[this]] [member]] name] 

내가 달성 할 방법

를 (오른쪽 이중 대괄호 통지) :

[dim[e]nsion].[this] [member] name] 

이 내가 출력을 시도하고있는 무슨이다 :

는 입력 문자열 . NET을 사용하여 RegEx와 함께?

더 많은 예제 :

Input: [dim[en]sion n[a]me ].[this [member] name] 

Output: [dim[en]]sion n[a]]me ].[this [member]] name] 

Input: [[dimension] name].[this member [name]] 

Output: [[dimension]] name].[this member [name]]] 
+0

정규식은 이와 같은 일치를 처리 할 수 ​​없습니다. "내부"를 언급 할 방법이 없습니다. 아마 작동 할 수도있는 미친 lookahead 표현식을 구현할 수도 있지만, 정규식보다 진보 된 것을 사용하는 것이 좋습니다. – KRyan

+0

'this'가 나온 후']'가 왜 이스케이프됩니까? –

+0

몇 가지 예제 입력 및 출력을 제공 할 수 있습니까? 그 점 문자의 왼쪽과 오른쪽이 어떻게 포맷 될지는 분명치 않습니다. –

답변

0

루핑이 필요하지 않습니다. 우리는 모든 오른손 브래킷을 일치시키고 싶지만 마지막 점과 점 (.) 바로 앞에 오는 점은 일치시킵니다. 오른쪽 괄호 뒤에 단일 문자가오고 점이 아닌 문자로 지정해야합니다. 적절한 .NET 방식에 대해서는 잘 모르겠지만 ]([^\.])에 일치하고 ]]$1으로 바꿉니다. 여기에서 $1은 일치 패턴의 괄호 안에있는 내용에 대한 역 참조입니다. 입력이 끝날 때 공백을 예상하는 경우 먼저 공백을 뒤따라 마지막 ]을 대체하므로 먼저 공백을 청소하는 것이 좋습니다.

현재 테스트 할 수 있습니다 http://www.regular-expressions.info/javascriptexample.html

편집 1 : http://imgur.com/a/VfR7W

편집 2 :sed (실제 컴퓨터에 얻을 필요) 확인 :

검증 위의 테스터를 사용하여
~ $ echo "        
[dim[e]nsion].[this] [member] name] 
[dim[en]sion n[a]me ].[this [member] name] 
[[dimension] name].[this member [name]] 
" > input.txt 
~ $ cat input.txt 

[dim[e]nsion].[this] [member] name] 
[dim[en]sion n[a]me ].[this [member] name] 
[[dimension] name].[this member [name]] 

~ $ sed 's/]\([^\\.]\)/]]\1/g' input.txt 

[dim[e]]nsion].[this]] [member]] name] 
[dim[en]]sion n[a]]me ].[this [member]] name] 
[[dimension]] name].[this member [name]]] 

~ $ 

EDIT 3 : 초기 답변에서 matc h 패턴은 ]([^\.])으로 표시되고 점 (.)은 이스케이프 처리되어 리터럴 점 문자임을 나타냅니다. 언어에 따라 일치하는 다른 문자를 이스케이프해야 할 수도 있습니다.

+0

앤드류, 나는 이것을 시험해 보았다. 그리고 그것과 일치하지 않는 것은 그것을 보살 피는 것처럼 보였다. 닫는 대괄호 뒤에 공백이 없다고 가정 할 수 있습니다. – hopsusa

+0

죄송 합니다만 정규 표현식은 정확합니다. 위에 링크 된 테스트 도구 (regular-expressions.info)를 사용하여 시연하고 결과를 다음에 업로드했습니다. http://imgur.com/a/VfR7W 발생하는 문제는 아마도 이스케이프 또는 구문 문제 때문일 수 있습니다. 이 찾기/바꾸기를 수행하는 데 사용하고있는 실제 코드를 제공해 주시겠습니까? –

+0

앤드류 ... 이것은 분명히 문제를 해결했습니다! 나는 그것이 가능할 것이라고 정말로 생각하지 않았다. 시간을 내 주셔서 감사합니다. – hopsusa

1

규칙은 매우 간단 삽입]에] 만 [

string str = "[dim[e]nsion].[this] [member] name]"; 
char[] chars = str.ToArray(); 
StringBuilder sb = new StringBuilder(); 
bool leftLast = false; 
foreach (char c in chars) 
{ 
    sb.Append(c); 
    if (c == '[') 
    { 
     leftLast = true; 
    } 
    else if (leftLast && c == ']') 
    { 
     sb.Append(']'); 
     leftLast = false; 
    } 
} 
Debug.WriteLine(str); 
Debug.WriteLine(sb.ToString()); 

정규식마다 ']'다시보고 적용 찾을 것이라고 후에 경우입니다.
이 char [] 루프는 불필요한 역 분석을 제거합니다.
lastLeft가 false 인 경우 비교할 이유가 없습니다.

관련 문제