2013-10-25 2 views
3

정규 표현식 내가이 보이는 문자열의 값을 추출 할 필요가 자바

nameClass 

을이 적용
nameClass (val1)(val2)(val1)...(valn) 

나는 정규식을 만들려고하지만

nameClass (val1)(val2) 

변형 만 맞는 (오렐 Moraru 개선 후) 다음과 같습니다 : I을 어떻게

String pattern = "((?:[a-z]+[A-Z][a-z]+))(([ |(]+)([-|+]?\\d+)([ |(|)]+)([-|+]?\\d+)([ |)]+))*"; 

모두에게 적용 가능한 패턴을 만든다.

nameClass 

nameClass (val1)(val2)(val1)...(valn) 

?

자바 코드 :

String txt = "inputTestdata(12)(-13)"; 
String patern = "((?:[a-z]+[A-Z][a-z]+))([ |(]+)([-|+]?\\d+)([ |(|)]+)([-|+]?\\d+)([ |)]+)"; 

Pattern p = Pattern.compile(patern); 
Matcher m = p.matcher(txt); 
if (m.find()) 
{ 
    for (int i = 1; i < m.groupCount(); i ++) 
    { 
    System.out.print(m.group(i) + "\n"); 
    } 
} 
+1

를 중첩 할 수 있습니까? – anubhava

+0

아니요, 그냥 하나씩 또 하나 – Miciurash

+1

정말이 정규식이 필요합니까? 문자열을 가로 지르고 하위 문자열을 추출하는 것은 어떨까요? – ogzd

답변

4

당신이 코드를 사용할 수 있습니다

String s = "nameClass(val1)(val2)(val3)"; 
Pattern p = Pattern.compile("^(\\w+) *(.*)$"); 
Matcher m = p.matcher(s); 
String ps = ""; 
if (m.matches()) 
{ 
    ps = m.group(2); 
    System.out.printf("Outside parantheses:<%s>\n", m.group(1)); 
} 
Pattern p1 = Pattern.compile("\\(([^)]*)\\)"); 
Matcher m1 = p1.matcher(ps); 
while (m1.find()) 
{ 
    System.out.printf("Inside parentheses:<%s>%n", m1.group(1)); 
} 

OUTPUT : 브래킷은 또한

Outside parantheses:<nameClass> 
Inside parentheses:<val1> 
Inside parentheses:<val2> 
Inside parentheses:<val3> 
+0

을 사용하는 것이 바람직합니다.이 코드는 모든 경우에 작동하지 않습니다. "nameClass", "nameClass (var1)", "nameClass (var1) (var2)", "nameClass (var1) (var2) (var4) (var5) " – Miciurash

+0

이 대답으로 작동하지 않는 일부 입력을 제공 할 수 있습니까? – anubhava

+0

예를 들어 "nameClass"문자열 만 있으면 가능합니다. 작은 수정을하면 실행시킬 수 있습니다. 패턴 p = Pattern.compile ("^ (\\ w +) * (. *) $"); – Miciurash

3

은 가정 : 그것은 당신이 괄호를 소독 할 nameClass

  • 시작으로

    • 당신의 입력으로 (한, 검증 할 필요가 없습니다 당신의 질문은 현재 나를 이해하게한다)

    ... 괄호 사이의 모든 내용을 내용으로 바꾸지 않으시겠습니까? 예를 들어

    :

    Pattern p = Pattern.compile("\\((.+?)\\)"); 
    String[] inputs = {"nameClass", "nameClass (var1)", "nameClass (var1) (var2)"}; 
    Matcher m; 
    for (String input: inputs) { 
        m = p.matcher(input); 
        System.out.println("Input: " + input + " --> replacement: " + m.replaceAll("$1")); 
        // resetting matcher after "replaceAll" and accessing values directly by group 1 reference 
        m.reset(); 
        while (m.find()) { 
         System.out.println("\tFound value: " + m.group(1)); 
        } 
    } 
    

    출력 :

    Input: nameClass --> replacement: nameClass 
    Input: nameClass (var1) --> replacement: nameClass var1 
        Found value: var1 
    Input: nameClass (var1) (var2) --> replacement: nameClass var1 var2 
        Found value: var1 
        Found value: var2 
    
  • 0

    내가 더 정규식 전문가는 아니지만 그러나이 작동합니까?

    \s*\w+\s*(\(\w+\))* 
    
    관련 문제