【问题标题】:Split String in java by specified pattern按指定模式在java中拆分字符串
【发布时间】:2016-05-13 13:59:07
【问题描述】:

如何在 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 包含您需要的内容。

标签: java regex string split


【解决方案1】:

你可以尝试使用:

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

【讨论】:

  • 使用:while (mtc.find()) { String match = mtc.group(1); /* ... */ }.
  • 为了性能,不要使用勉强的量词 (*?),而是使用无法匹配右括号的贪婪量词:"\\(([^)]*)\\)"
  • 我可以在不使用 while 循环(或任何循环)的情况下找到匹配器 (mtc) 包含的项目数吗?为了定义String数组的大小。
【解决方案2】:

最好的解决方案是answer by Rahul Tripathi,但你的问题是“如何拆分”,所以如果你必须使用split()(例如这是一个作业),那么这个正则表达式就可以了:

^\s*\(|\)\s*\(|\)\s*$

上面写着:

  • 匹配开头的左括号
  • 匹配右括号后跟左括号
  • 匹配末尾的右括号

所有 3 个都允许空格。

作为 Java 正则表达式,这意味着:

str.split("^\\s*\\(|\\)\\s*\\(|\\)\\s*$")

见regex101 for demo。

使用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 的答案更好的原因,因为它不会看到这样一个空值。

【讨论】:

    【解决方案3】:

    通常,您会希望使用 split() 函数,因为这是在字符串被键字符分解时将字符串拆分为多个数组的最简单方法。

    主要问题是您需要在两个字符之间的信息。解决此问题的最简单方法是遍历字符串 getride 的每个 '(' 实例。这使字符串看起来像

    String = "1,2,3,4,@) a,s,3,4,5) 22,324,#$%) 123,3def,f34rf,4fe) 32)"

    这是完美的,因为您可以通过 char ')' 进行拆分,而不必担心另一个括号会干扰拆分。我建议使用 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[],它应该为您提供所有必需的部分!

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 2019-03-27
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 2022-07-12
      • 2018-02-06
      相关资源
      最近更新 更多