2013-03-08 3 views
0

Regex를이 컨텍스트에서 사용하는 것에 대해 오해하고있는 경우 미리 사과드립니다.Regex를 사용하여 문자열에서 반복되는 값 검색

문자열에서 반복 필드를 검색하고 싶습니다.

TrendsJSONImpl {asOf = 금 3월 8일 그리니치 표준시 00시 04분 26초 2013 trendAt = 금 3월 8일 그리니치 표준시 00시 04분 26초 2013> 동향 = [TrendJSONImpl {이름 - 문제의 문자열은 다음과 같이 보입니다 TrendJSONImpl {name = '# ICanHonestlySay',> url = 'URL', query = '% 23ICanHonestlySay'}> TrendJSONImpl {이름 = '#BiggestLies', url = 'URL', 검색어 = '% 23TheBiggestLies'}, #EuTenhoUmaQuedaPor ', URL ='URL ', 쿼리 ='%의 23EuTenhoUmaQuedaPor '}> TrendJSONImpl {이름 ='#의 CitePessoasExclusivamenteSuas ', URL ='URL ', 쿼리 ='%의 23CitePessoasExclusivamenteSuas '}이에서

문자열, 나는 "이름"필드를 검색하고 목록에 추가하고 싶습니다. 이 문자열은 트위터의 트렌드 주제를 나타내며 트렌드를 생성하는 메소드가 호출 될 때마다 변경 될 수 있습니다. 나는 다음과 같이 이름 필드를 추출하기 위해 시도 여기에 이전 기사 다음

#TheBiggestLies

#ICanHonestlySay

#CitePessoasExclusivamenteSuas

-

이상적인 출력은 다음과 같을 것 코드 -

UI.model = new DefaultListModel(); 
      String trendsInfo = //FUNCTIONWHICHRETRIEVESSTRING 
        Matcher m = Pattern.compile("{name=").matcher(trendsInfo); 
      Pattern p = Pattern.compile(
        "{name='(.*),", 
        Pattern.DOTALL); 
      Matcher matcher = p.matcher(trendsInfo); 


      while (matcher.find()) { 
       for (int i = 0; i < 20; i++) { 
        String output = m.group(i); 
        UI.model.addElement(output); 
        System.out.println(m.group(i)); 
       } 
      } 

불행히도 이것은 불법 반복 예외를 반환하고 동일한 필드의 여러 쿼리를 처리하는 방법을 모르겠습니다. 이 문제에 도움을 주시면 감사하겠습니다.

시간 내 주셔서 감사합니다.

+0

추가 팁 : ""{name = '(. *) "대신"{name ='(. *?) ' "'그래서 일치는 이름 뒤에 첫 번째 아포스트로피로 끝납니다. –

답변

0

정규 표현식에 문자가 { 인 예외가 발생하는 이유가 여기에 있습니다. 예약 문자이므로 이스케이프해야합니다 (\\{).

그 외의 경우 두 번째 ' (쉼표 앞)이 ​​누락 된 것처럼 보입니다. 게으른 정규 표현식을 사용하는 것도 좋은 생각 일 수 있으므로 최종 버전은 \\{name='(.*?)',과 같습니다. 어쩌면 해시 문자를 추가하여 더 정확하게 만들 수도 있습니다. \\{name='(#.*?)', ...

+0

안녕하세요! 빠른 답장을 보내 주셔서 대단히 감사합니다. 나는 당신의 제안을 보드에 가져 왔고, 불행하게도 여전히 예외를 받고있다. 특별히 - "AWT-EventQueue-0"스레드의 java.util.regex.PatternSyntaxException : 잘못된 반복 {name = 의견이 있으십니까? 감사합니다. – iainmac

+0

예제 코드의 세 번째 줄에있는 다른 regexp도 탈출 했습니까? 항상'{'문자를 가지고있을 때는'\\ {'를 쓰면됩니다.'{'는 반복을 위해 예약되어 있습니다. – mkataja

+0

안녕하세요 mkataja, 정말 고맙습니다.예외 문제를 해결했지만 어떤 이유로 문자열에서 모든 정보를 반환하지 않고 단지 5 개의 결과 만 반환합니다. 가장 최근의 코드는 다음과 같습니다 - String trendsInfo = WorldWideTrendsList.toString(); \t \t \t \t \t \t System.out.println (trendsInfo); \t \t \t \t \t \t 패턴 p =는 Pattern.compile ( \t \t \t \t \t, \t Pattern.DOTALL "(* #) \\ '.?"); \t \t \t Matcher matcher = p.matcher (trendsInfo); \t \t \t \t \t \t 동안 (matcher.find()) { \t \t \t \t \t \t \t \t \t 문자열 출력 = matcher.group (1); \t \t \t \t \t \t \t \t \t \t에서 System.out.println (출력); \t \t \t \t \t UI.model.addElement (출력); – iainmac

0

{은 정규 표현식의 반복 연산자이므로, 다음과 같이 이스케이프 처리해야합니다 : \\{.

관련 문제