2012-11-26 3 views
0

줄 바꿈이있는 문자열의 패턴을 어떻게 일치시킬 수 있습니까? 예 :JAVA Linebreaks가있는 문자열에서 가장 긴 패턴 일치

requisition({"title":"my json", 
      "items" : [{ "A": "a", 
          "B": "b"} 
         ] 
      }) 

는 난 단지

{"title":"my json", 
      "items" : [{ "A": "a", 
          "B": "b"} 
         ] 
} 

내가

String pattern = ".*(\\{.*\\}).*"; 
Pattern r = Pattern.compile(pattern, Pattern.DOTALL); 

하지만 성공과 같은 시도이를 잡으려고합니다. 어떤 설교?

더 명확하게 말하자. 이것은 내 input

+0

"성공하지 못했습니다." 실패합니까? 틀린 경기를합니까? 어느 것? 나는''A '...''에서 시작하는 모든 것을 포착한다고 가정할까요? –

+0

@Reimeus, 내가하려고하는 JSON 구문 분석기 구현입니다. – Medeiros

+0

항상 입력이이 형식입니까? 내 말은, 그것은 항상 매개 변수로 일부 JSON 개체와 함수 호출을 무엇입니까? 이 경우 하위 문자열을 사용할 수 없습니까? –

답변

1

입력으로 단일 JSON 개체의 문제는 간단합니다 : 첫 번째 .* 욕심입니다. 따라서 마지막으로 {이 표시되고 그 후에도 }이 표시 될 때까지 모든 것이 소모됩니다. 당신이 ungreedy .* (또는 그것을 밖으로 왼쪽) 것을 만든 경우 전체 JSON 개체를 얻을해야합니다

String pattern = ".*?(\\{.*\\}).*"; 

을하지만 당신은 (그리고해야한다) 완전히 시작과 후행 반복을 남길 수 있습니다 :

String pattern = "\\{.*\\}"; 

그러면 아무 것도 캡처 할 필요가 없습니다. 이 값은 matches 대신 find과 함께 사용해야합니다.

그러나 입력에 여러 JSON 개체가 있습니다. 그리고 이것이 정규 표현식에 문제가있는 곳입니다. 일부 엔진은 대괄호를 올바르게 중첩 할 수있는 구조를 지원합니다 (어느 것이 실제로 함께 속하는지 확인). 하지만 이러한 정규 표현식은 쉽게 추악하고 유지 보수가 불가능할 수 있습니다.

문자열을 수동으로 걷고 현재 중첩 수준을 유지하는 것이 좋습니다. 최상위 수준으로 돌아갈 때마다 하위 문자열을 잘라냅니다 (해당 여는 대괄호에서 현재 위치까지).

+0

감사합니다. 나는 Python으로 프로그래밍하는 데 익숙해졌으며 문제를 해결하기 위해 RE의 힘을 원하지만,이 특별한 문제에서 가장 좋은 해결책은'String sub = s.substring (s.indexOf ("{"), s.lastIndexOf "}") + 1); – Medeiros

+0

@Medeiros 예, 단일 JSON 객체의 경우 아마도 가장 좋은 (그리고 가장 읽기 쉬운) 해결책 일 것입니다. 그러나 JSON 객체 목록이 포함 된 파일에 대해서는 문제를 해결하지 못합니다. –