Java中如何按指定模式拆分字符串

5
在Java中如何拆分这个字符串,以便将出现在大括号内的文本获取到并存储在一个字符串数组中?
GivenString = "(1,2,3,4,@) (a,s,3,4,5) (22,324,#$%) (123,3def,f34rf,4fe) (32)"

String [] array = GivenString.split("");

输出必须是:

array[0] = "1,2,3,4,@"
array[1] = "a,s,3,4,5"
array[2] = "22,324,#$%"
array[3] = "123,3def,f34rf,4fe"
array[4] = "32" 

1
使用这个模式"\\((.*?)\\)"。然后$1包含你需要的内容。 - Shafizadeh
3个回答

7

您可以尝试使用以下方法:

Matcher mtc = Pattern.compile("\\((.*?)\\)").matcher(yourString);

1
使用:while (mtc.find()) { String match = mtc.group(1); /* ... */ } - sp00m
为了提高性能,应该使用贪婪量词而不是勉强量词(*?),并且不能匹配闭合括号:"\\(([^)]*)\\)" - Andreas
我能否在不使用while循环(或任何循环)的情况下找到匹配器(mtc)包含的项目数量?以便定义String数组的大小。 - mayank bansal

2
最佳解决方案是Rahul Tripathi的答案,但你的问题中提到了“如何拆分”,所以如果你必须使用split()(例如,这是一个任务),那么这个正则表达式可以实现:
^\s*\(|\)\s*\(|\)\s*$

它说:
  • 匹配开头的左括号
  • 匹配右括号后面跟着左括号
  • 匹配结尾的右括号
这三个都允许空格。
作为Java正则表达式,它的意思是:
str.split("^\\s*\\(|\\)\\s*\\(|\\)\\s*$")

请查看regex101演示

使用split()的问题在于,前导开括号导致在第一个值之前分裂,从而在开头产生一个空值:

array[0] = ""
array[1] = "1,2,3,4,@"
array[2] = "a,s,3,4,5"
array[3] = "22,324,#$%"
array[4] = "123,3def,f34rf,4fe"
array[5] = "32"

这就是为什么Rahul的答案更好,因为它不会看到这样的空值。

0
通常,使用split()函数是将字符串分割成多个数组的最简单方法,当字符串被键字符打断时。主要问题是需要获取两个字符之间的信息。解决此问题的最简单方法是通过字符串并清除每个“(”的所有实例。这使得字符串看起来像
字符串=“1,2,3,4,@)a,s,3,4,5)22,324,#$%)123,3def,f34rf,4fe)32)”
这很完美,因为您可以通过')'字符进行拆分,而不用担心其他括号会干扰拆分。建议使用replace("","")替换每个第一个参数的实例与第二个参数(我们可以使用“”删除它)。
以下是一些可能有效的示例代码:
String a = "(1,2,3,4,@) (a,s,3,4,5) (22,324,#$%) (123,3def,f34rf,4fe) (32)" 
a = a.replace("(","");
//a is now equal to 1,2,3,4,@) a,s,3,4,5) 22,324,#$%) 123,3def,f34rf,4fe) 32)
String[] parts = a.split("\\)");

System.out.println(parts[0]); //this will print 1,2,3,4,@

我还没有完全测试它,所以你可能会在字符串末尾得到不需要的空格,需要把它们去掉!

然后你可以循环遍历parts[],它应该包含你所需的所有部分!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接