2013-07-22 2 views
2

나는 어떤 종류의 파서를 구현 중이므로 json 객체 을 다른 반 구조화 된 데이터에 삽입하고 비 직렬화해야합니다.중첩 된 json 객체와 일치하는 정규식

\\{\\s*title.*?\\} 

객체에게

{title:'Title'} 

을 찾을 수 있지만 표현은 단지 첫 번째 중괄호를 닫는 발견 일치하기 때문에 중첩 된 객체와 함께 작동하지 않습니다 : 저는 정규 표현식을 사용했다.

{title:'Title',{data:'Data'}} 

을 위해 그것은

{title:'Title',{data:'Data'} 

그래서 문자열이 직렬화에 대한 무효가 일치합니다. 욕심 많은 사업이 고려되고 있지만 정규식에 익숙하지 않다는 것을 알고 있습니다. 가능한 닫는 중괄호를 모두 사용하도록 표현을 확장하도록 도와주십시오.

업데이트 :

가 명확하게하려면,이 포함 된 JSON과 HTML + JS 같은 반 구조화 된 데이터에서 JSON 데이터를 추출하기위한 시도이다. 나는 추출한 JSON을 실제로 파싱하기 위해 GSon JAVA lib를 사용하고 있습니다.

+0

은 조심 "OMG, 그것은 eevil의 정규식을 사용하지 마십시오!" – SmokeyPHP

+0

..하지만 모든 진지한 - 왜? 무엇을 손에 넣을 데이터이고, 그걸로 무엇을 성취해야합니까? – SmokeyPHP

+3

@ViktorStolbin 미리 만들어진 JSON 파싱 라이브러리가 있습니다. 또한 JSON은 일반 언어가 아니기 때문에 HTML과 마찬가지로 정규 표현식으로 올바르게 파싱 할 수 없습니다. –

답변

1

감사합니다 "중괄호 일치"나는 결국 내가하지 말아야 할 것을 처음 말을 다른 사람에 대한 욕심이 표현도 감사의 어떤 이해를 가지고 있기 때문이다. 다행히도 그것은 닫는 괄호 사이에 비 JSON 데이터가 없기 때문에 표현

\\{\s*title.*\\} 

의 욕심 변형을 사용하는 것이 괜찮 밝혀졌다.

3

다른 사람들이 제안했듯이 JSON 파서가 가장 좋은 방법 일 것입니다. 당신은 당신이 위에있는 간단한 예제에서 키 - 값 쌍을 일치 시키려면, 다음과 같이 사용할 수 있습니다

(?<=\{)\s*[^{]*?(?=[\},]) 

를 입력 문자열

{title:'Title', {data:'Data', {foo: 'Bar'}}} 

이 일치하는 경우 :

1. title:'Title' 
2. data:'Data' 
3. foo: 'Bar' 
+0

나는 그것을 시도해야한다! 고맙습니다! –

0

이것은 절대적으로 끔찍한 일이며 실제로이 솔루션에 제 이름을 넣을 수는 없지만 Javascript 블록에있는 첫 번째 { 문자를 찾을 수는 없습니까? 적절한 JSON 파싱 라이브러리를 통해 나머지 문자를 파싱 하시겠습니까? 작동하면 일치하는 것입니다. 그렇지 않으면 다음 { 문자까지 읽은 다음 다시 시작하십시오.

가 몇 가지 문제가 있습니다,하지만 그들은 아마 해결할 수 있습니다

  • 당신은 자바 스크립트 블록을 식별 할 수 있어야합니다. 대부분의 언어는 <script>...</script> 블록에 집중하기 쉽게 HTML 기반 DOM 라이브러리 (Java 용 Cyberneko의 큰 팬)를 보유하고 있습니다.
  • JSON 구문 분석 라이브러리는 오류가 발생하자마자 스트림에서 문자를 소비하지 않아야하며 스트림이 닫힐 때 스트림을 닫을 필요가 있습니다.

당신이 } 트릭을해야 찾을 당신이 {을 찾을 때마다 증가 및 감소되고 일치 } 일 (간단한 카운터를 찾기 위해, 첫 번째 {을 발견 한 번 개선 될 것). 결과 문자열을 JSON으로 구문 분석하려고 시도합니다. 작동 될 때까지 반복하거나 가능성이있는 블록을 다 썼습니다.

이, 추악한 hackish이며, 생산 코드에 그것을 만들해서는 안됩니다. 나는 배치 작업을 위해서만 필요하다는 인상을 받는다. 그래서 나는 심지어 그것을 제안하고있다. 저를 지적 @Sanjay T. 샤르마에

+0

오른쪽. 이것은 구현하기에보기 흉하고 간단하지 않습니다. –