2012-10-08 30 views
0

我在Java中的字符串,以这种格式保存数据字符串中的字符:Java的检索括号

String x = "xxxxxx xxxxxx xxxxxx (xxx)"; 

如何设置该字符串的值,只是在括号中的字符,不包括括号? (请注意,字符大小在每种情况下都会有所不同)。

+3

使用String.split方法.. –

+0

@RohitJain如何,究竟你会使用分割方法?它你做了,它会有点复杂。 – Bohemian

+0

@Bohemian ..不是那么复杂..看到我的回答如下.. –

回答

6

单线解决方案是使用String.replaceAll()和适当的正则表达式捕获整个输入(有效地替换整个输入),但也捕获(非贪婪)作为组1的部分,然后放回该基团:

String part = x.replaceAll(".*\\((.*?)\\).*", "$1"); 

仅供参考,在正则表达式的字符串双背斜线是单斜线中的正则表达式,其然后逸出的字面括号中的正则表达式

这里的一些测试代码:

public static void main(String[] args) { 
    String x = "xxxxxx xxxxxx xxxxxx (xxx)"; 
    String part = x.replaceAll(".*\\((.*)\\).*", "$1"); 
    System.out.println(part); 
} 

输出:

xxx  
+0

现在应该可以正常工作,但''是什么? –

+0

你是什么意思''? – Bohemian

+1

'公共静态' –

3

regex将做到这一点,但我的正则表达式福较弱。非正则表达式的方法如下:

int firstIndex = x.indexOf("("); 
x = x.substring(firstIndex+1, x.length()-1); 

编辑:正如在评论中指出,如果有任何其他的括号中的数据,比在其他结束,这是不行的。您需要使用以下代替:

int firstIndex = x.lastIndexOf("(", x.length()-6); 
x = x.substring(firstIndex+1, x.length()-1); 

编辑2:刚刚重读并意识到关闭paren是最后一个字符。所以没有必要获得第二个索引。

+2

如果输入是“abc)def(ghi)”,那么你的解决方案将不起作用。实际上它会抛出异常。 – Bohemian

+1

是的。这是最大的问题,为什么你提出的正则表达式更好。从他解释这个问题的方式来看,我认为只有在最后才会发生parens。如果这不是真的,那么我可能已经填充indexOf的第二个参数来防止它看起来太快,或者使用lastIndexOf。 – KBKarma

+1

因为我似乎无法编辑我的评论,所以我会将其放在这里:我编辑了我的答案以防止发生这种情况。另外,由于最后一个字符是')',所以不需要计算第二个索引。只需使用length-1,并且子字符串方法将在')'之前停止。 – KBKarma

1

您可以使用这种提取方法String.split ..

String x = "xxxxxx xxxxxx xxxxxx (xxx)";  
String[] arr = x.split("\\("); 

x = arr[1].substring(0, arr[1].indexOf(")")); // To remove the trailing bracket. 

System.out.println(x);