2009-08-26 5 views
10

나는 다음과 같은 패턴이 있습니다 정규식을 사용하여 괄호 안의 텍스트를 어떻게 일치시킬 수 있습니까?

(COMPANY) -277.9887 (ASP,) -277.9887 (INC.) 

내가 최종 출력이 원하는을 :.

회사 ASP, INC

현재

나는 다음과 같은 코드를 가지고 원래 패턴을 반환 유지 (그룹이 모두 첫 번째 '('마지막 ') 사이에 있기 때문에 가정합니다.

Pattern p = Pattern.compile("((.*))",Pattern.DOTALL); 
Matcher matcher = p.matcher(eName); 
while(matcher.find()) 
{ 
    System.out.println("found match:"+matcher.group(1)); 
} 

내가 원하는 결과를 얻으려고 애 쓰고 있습니다. 어떤 도움을 주셔서 감사합니다. 나는 각 그룹을 얻은 후에 결과를 연결하는 것에 대해 걱정하지 않는다. 단지 각 그룹을 얻을 필요가있다.

답변

28
Pattern p = Pattern.compile("\\((.*?)\\)",Pattern.DOTALL); 
+0

카오스! 나는 그 패턴을 시도해 보지 못했고 그것이 필요한만큼 정확하게 작동했습니다. 대답 할 시간을내어 주셔서 감사합니다! – northpole

+0

반갑습니다. :) – chaos

0

하지 귀하의 질문에 직접 대답하지만 난 당신이 대답하고 신속하게 미래의 질문에 도착 RegxTester를 사용하는 것이 좋습니다. 그것은 당신이 실시간으로 테스트 할 수 있습니다.

+0

그것은 자바가 아니라 .NET regexes를 지원합니다. – wds

6

. * 수량 기호는 'greedy'이므로 첫 번째 괄호와 마지막 괄호 사이의 모든 것을 가져옵니다. 카오스가 말하듯이, 간결하게 :). *? 비 욕심쟁이 한정어이기 때문에 일치를 유지하면서 가능한 한 작게 잡을 것입니다.

정규식 내에서 괄호를 이스케이프해야합니다. 그렇지 않으면 다른 그룹이됩니다. 그것은 당신의 문자열에 리터럴 괄호가 있다고 가정합니다. 나는 당신의 패턴이 사실 당신의 끈이기 때문에 당신이 초기 질문에서 언급 한 것을 의심합니다.

쿼리 : "COMPANY", "ASP"및 "INC." 이 필요합니다.?

값이 필요하다면 * 대신 *를 사용하고 +는 1 이상이되며 *는 0 이상이되므로 *는 리터럴 문자열과 일치합니다. "() "

예 :"((+.?)) "당신의 문자열이 항상 같이하려는 경우

+0

이것은 좋은 팁 감사합니다. 사실 그 사이에 값이있는 경우에만()을 갖습니다. 그러나 나는 이것을 미래에 표시 할 것입니다. 감사! – northpole

+0

'보다'구체적으로하려고 할 수는 있습니다. 귀하의 그룹도 일치합니다. 문자열에 대문자 만 포함하고 구두점을 사용하는 경우 "\\ (([A-Z,.] +?) \\)"와 같은 것을 시도 할 수 있습니다. 이런 식으로, dodgy 데이터는 적어도 발견되었고 수정할 수 있습니다. – ptomli

0

, 당신은 단지 몇 대신 완전히 대체 호출을 사용하여 멀리 얻을 수 있습니다. 이것은 나를 위해 작동하는 것 같습니다 :

String eName = "(COMPANY) -277.9887 (ASP,) -277.9887 (INC.)"; 
     String eNameEdited = eName.replaceAll("\\).*?\\("," ").replaceAll("\\(|\\)",""); 
     System.out.println(eNameEdited); 

아마 세계에서 가장 효율적인 것은 아니지만 상당히 간단합니다.

1

Java 8 : /**로 테스트 * 아래 패턴은 괄호 안의 문자열을 반환합니다.

* Description about casting regular expression: \(+\s*([^\s)]+)\s*\)+ 

* \(+ : Exactly matches character "(" at least once 
* \s* : matches zero to any number white character. 
* (: Start of Capturing group 
* [^\s)]+: match any number of character except ^,) and spaces. 
*) : Closing of capturing group. 
* \s*: matches any white character(0 to any number of character) 
* \)*: Exactly matches character ")" at least once. 


private static Pattern REGULAR_EXPRESSION = Pattern.compile("\\(+\\s*([^\\s)]+)\\s*\\)+"); 
관련 문제