2013-10-25 81 views
3

我需要提取,看起來像這樣的字符串值:正則表達式中的括號提取值Java

nameClass (val1)(val2) 

有:

nameClass 
val1 
val2 

的問題是,它也必須是適用於本:

nameClass 

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

我試圖創建的正則表達式,但它僅適合用於

nameClass (val1)(val2) 

變形,看起來像這樣(由維奧雷爾Moraru得到改善後):

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

我如何使圖案適用於所有

nameClass 

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

Java代碼:

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

此代碼不適用於所有情況:「名稱類」,「名稱類(var1)」, (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+\))*