2011-05-15 2 views
1

단일 대괄호와 일치하는 뒤에 공백이 아닌 대괄호와 공백이 아닌 일치 항목을 찾으려고합니다.Regex [ S하지만 [[ S?

Aka: This is ok: [s 
     This should be skipped: [[s 

나는 @"\[[\S^\[]"을 가지고 있지만 제대로 작동하지 않습니다.

편집 : 조금 명확하게하기 위해 나는 위키 파서를 연구 중이다. (그래서 그것은 문자열 기반이다 - 나는 그것이 정규 표현식이 무엇인지에 대해서만 생각했다). 내 링크는 [,로 시작하지만 두 번 [[. 위키는 이미 작동하지만 확장하기 쉽도록 (잘하면) 수정 된 버전을 만들고 있습니다.

foreach (Rule rule in rules) 
{ 
    if (position + rule.Length > text.Length) 
     break; 
    if ((rule.PreCondition & condition) == rule.PreCondition) 
    { 
     if (substring.Length < rule.Length) 
      substring = text.Substring(position, rule.Length); 
     if (rule.Pattern.IsMatch(substring)) 
     { 
      string previous = text.Substring(0, position); 
      sb.Append(previous); 
      text = text.Remove(0, position); 
      position = 0; 
      text = rule.Handler(new HandlerParameter(text, condition, previous)); 
     } 
    } 
} 

는 그래서 BracketHandler 우리가 브래킷에 있다면 결정하기 위해 패턴을 사용

다음은 처리기 코드를 호출합니다. 원래 패턴은 \[\S 이었지만 [[[s]를 확인하는 경우에는 작동하지 않습니다. 이전 문자의 마지막 문자는 [. 내 복잡한 코드로 머리를 숙이고 있지만 최소한 게시 할 수 있도록 게시됩니다.

답변

4

부정적인 lookbehind 사용할 수 있습니다

@"(?<!\[)\[[^[\s]" 

을 (와우는 불길한 보이는 어 ...?)

편집 :

@"(^|[^[])\[[^[\s]" 
하십시오 lookbehind을 필요로하지 않는 잠재적 인 대안
+0

Perl과 비슷해 보입니다. 그렇습니다. 예 : 그렇습니다. –

+0

일부 경우에는 작동하지만 모든 것이 아닌 것은 고맙습니다. 나는 이중 괄호에 대해 사전 파싱을 끝내었다. 질문, lookbehind가 느려질 것입니다, 그 이유는 다른 것입니까? –

0

나는 문제는 ^가 부정을 나타내는 그룹의 시작 부분에 있어야한다는 것입니다. 왜 부정적인 공간의 그룹 '['과 같이 표시하지 :

@"\[[^\s\[]" 
+0

문자열의 시작 부분부터 만 작동하므로 OP가 문자열을 검색하는지 여부에 따라 다릅니다. – bluepnume

+0

\ s는 공백이며 \ S는 공백이 아닙니다. 여전히 그것이 작동하지 않습니다, 그것은 [[s. –

0

내가 여기서 뭔가를 놓치고를, 또는 [^[]\[[^\s[] 문제없이 작동합니다?

+0

이것은 juharr의 해결책과 반대되는 문제가 있습니다 : 문자열 시작 부분에 [s]가 있으면 일치하지 않습니다. – bluepnume