2014-09-01 1 views
2

어떻게 코드 블록 경우 구조에서와 같이 유효성을 검사 :Java에서 코드 블록이 올바르게 중첩되어 있는지 확인하십시오.

{ 
    // Any amount of characters that aren't '{' or '}' 
} 

가 제대로 바람직 정규식과 중첩하고 있습니까?

{{ 
    {{}} 
} {} // Not properly nested 

As referred to from this thread

{} { 
    {} {} 
} // Properly nested 

는 재귀 같은 접근은 상기 regular expression constructs Java Pattern에 존재하지 않는 것처럼 균형 기는 여기에 적용 할 수 없다.

+6

이런 종류의 문제에는 정규 표현식을 사용하지 않을 것입니다. 나는 아마도 스택을 사용할 것이다. –

+0

@HovercraftFullOfEels 사용자 입력은'String'입니다. 이 상황에서 스택을 사용할 수 있습니까? – Unihedron

+0

예. 나는이 분야에 전문가가 아니지만 이런 종류의 일을 위해 이미 존재하는 파서가 아닌가? –

답변

3

왜 정규식을 사용합니까? 나 자신의 파서를 만드는 것이 좋습니다. 다음과 같은 것 :

public static boolean isProperlyNested(String toTest) { 
    int countOpen = 0; 
    for (char c : toTest.toCharArray()) { 
     if (c == '{') { 
      countOpen++; 
     } else if (c == '}') { 
      countOpen--; 
      if (countOpen < 0) return false; 
     } 
    } 
    return countOpen == 0; 
} 
+1

이것은 단순화 된 것입니다. 예를 들어, 주석에서 열기 또는 닫기 중괄호가 숨겨져있는 코드 조각을 어떻게 처리 할 것인가? 스택이나 상태 머신이 들어오는 BTW입니다. –

+0

@MarkRotteveel 스택이 실제로 더 잘 작동하지 않습니다. 단지 주석/문자열/문자/등을 토글하는 부울을 포함하고, 그 중 하나가 사실 일 경우 카운트를 변경하지 마십시오. – Justin

+0

이 특정 예제에서는 스택이 아마도 과장 될 것입니다 (그러나 중괄호 **와 ** 괄호의 균형을 추적하려는 경우). 파서의 현재 상태를 추적하기 위해 부울 집합보다 열거 형을 더 빨리 선택 하겠지만 (실제로 실제로 Jaybird를 사용 했으므로 주 스위치 자체를 상태 스위치로 남겨 둘 수 있습니다. http://sourceforge.net/p/firebird/code/HEAD/tree/client-java/trunk/src/main/ org/firebirdsql/jdbc/escape/FBEscapedParser.java # l364). –

0

는 I 루프로 이용하여이 두 단계를 해결할 수

{ 
    String str1 = "{} {\n" + 
        " {} {}\n" + 
        "} // Properly nested", 
      str2 = "{{\n" + 
        " {{}}\n" + 
        "} {} // Not properly nested"; 
    final Pattern pattern = Pattern.compile("\\Q{}\\E"); 

    Matcher matcher = pattern.matcher(str1.replaceAll("[^{}]", "")); 
    while (matcher.find()) 
     matcher = pattern.matcher(str1 = matcher.replaceAll("")); 
    System.out.println(str1.isEmpty()); 

    matcher = pattern.matcher(str2.replaceAll("[^{}]", "")); 
    while (matcher.find()) 
     matcher = pattern.matcher(str2 = matcher.replaceAll("")); 
    System.out.println(str2.isEmpty()); 
} 

Here is an online code demo한다. 데모는 원래의 문자열 방향을 보여주기 위해 여기에서 쓴 코드와 약간 다릅니다.

관련 문제