我在Java中的字符串,以这种格式保存数据字符串中的字符:Java的检索括号
String x = "xxxxxx xxxxxx xxxxxx (xxx)";
如何设置该字符串的值,只是在括号中的字符,不包括括号? (请注意,字符大小在每种情况下都会有所不同)。
我在Java中的字符串,以这种格式保存数据字符串中的字符:Java的检索括号
String x = "xxxxxx xxxxxx xxxxxx (xxx)";
如何设置该字符串的值,只是在括号中的字符,不包括括号? (请注意,字符大小在每种情况下都会有所不同)。
单线解决方案是使用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
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是最后一个字符。所以没有必要获得第二个索引。
如果输入是“abc)def(ghi)”,那么你的解决方案将不起作用。实际上它会抛出异常。 – Bohemian
是的。这是最大的问题,为什么你提出的正则表达式更好。从他解释这个问题的方式来看,我认为只有在最后才会发生parens。如果这不是真的,那么我可能已经填充indexOf的第二个参数来防止它看起来太快,或者使用lastIndexOf。 – KBKarma
因为我似乎无法编辑我的评论,所以我会将其放在这里:我编辑了我的答案以防止发生这种情况。另外,由于最后一个字符是')',所以不需要计算第二个索引。只需使用length-1,并且子字符串方法将在')'之前停止。 – KBKarma
您可以使用这种提取方法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);
使用String.split方法.. –
@RohitJain如何,究竟你会使用分割方法?它你做了,它会有点复杂。 – Bohemian
@Bohemian ..不是那么复杂..看到我的回答如下.. –