使用正则表达式在Java中拆分字符串数组

使用正则表达式在Java中拆分字符串数组,java,arrays,regex,split,Java,Arrays,Regex,Split,我正在尝试拆分此字符串: aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6) 所以它看起来像这个数组: [a、b、a(2)、b、b(52)、g、c(4)、d(2)、f、e(14)、f(6)、g(8)] 这里是规则,它可以接受字母a到g,它可以是一个单独的字母,但如果后面有括号,它必须包含它们及其内容。括号的内容必须是数值 这就是我所尝试的: content = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";

我正在尝试拆分此字符串:

aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)

所以它看起来像这个数组:

[a、b、a(2)、b、b(52)、g、c(4)、d(2)、f、e(14)、f(6)、g(8)]

这里是规则,它可以接受字母a到g,它可以是一个单独的字母,但如果后面有括号,它必须包含它们及其内容。括号的内容必须是数值

这就是我所尝试的:

content = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";
        a = content.split("[a-g]|[a-g]\\([0-9]*\\)");
        for (String s:
             a) {
            System.out.println(s);
        }
这是输出

(二)

(52)

(4) (二)

(14) (6)(8)h(4)5(6)


谢谢。

匹配这些子字符串更容易:

String content = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";
Pattern pattern = Pattern.compile("[a-g](?:\\(\\d+\\))?");
List<String> res = new ArrayList<>();
Matcher matcher = pattern.matcher(content);
while (matcher.find()){
    res.add(matcher.group(0)); 
} 
System.out.println(res);
请参阅和

图案细节

  • [a-g]
    -从
    a
    g
  • (?:\(\d+\)?
    -一个可选的非捕获组,匹配1次或0次
    • \(
      -a
      字符
    • \d+
      -1+位
    • \)
      -a
      字符

    • 拆分是错误的方法,因为很难消除错误条目

      只要“匹配”,只要是有效的,就可以处理找到的匹配结果数组:

      [a-g](?:\(\d+\))?
      


      您可以尝试以下正则表达式:
      [a-g](\(.*?\)?

      • [a-g]
        :需要从a到g的字母
      • (\(.*)?
        :介于
        之间的任意字符数,匹配次数尽可能少
      您可以查看预期的输出

      此答案基于
      模式
      ,例如:

      String input = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";
      
      Pattern pattern = Pattern.compile("[a-g](?:\\(\\d+\\))?");
      Matcher matcher = pattern.matcher(input);
      List<String> tokens = new ArrayList<>();
      while (matcher.find()) {
          tokens.add(matcher.group());
      }
      
      tokens.forEach(System.out::println);
      
      编辑:使用
      [a-g](?:\(.*))?
      还可以轻松提取括号的内部值:

      while (matcher.find()) {
          tokens.add(matcher.group());
          tokens.add(matcher.group(1)); // the inner value or null if no () are present 
      }
      

      如果您只想使用拆分方法,这里有一种方法您也可以遵循

      import java.util.Arrays;
      
      public class Test 
      {
         public static void main(String[] args)
         {
              String content = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";
              String[] a = content.replaceAll("[a-g](\\([0-9]*\\))?|[a-g]", "$0:").split(":");
              // $0 is the string which matched the regex
      
              System.out.println(Arrays.toString(a));
      
         }
      
      }
      
      正则表达式:
      [a-g](\\([0-9]*\\)?|[a-g]
      匹配要匹配的字符串(即a、b、a(5)等)

      使用这个正则表达式,我首先将这些字符串替换为它们的附加版本(附加:)。稍后,我使用split方法拆分字符串

      上述代码的输出为

      [a, b, a(2), b, b(52), g, c(4), d(2), f, e(14), f(6), g(8), h(4)5(6)]
      

      注意:这种方法只适用于已知输入字符串中不存在的分隔符。例如,我选择冒号是因为我假设它不是输入字符串的一部分。

      它确实匹配所需的模式。。。但这对我来说是行不通的split@mettleap你说得对,我补充了更多细节来描述我是如何解决这个问题的。谢谢你的指点!谢谢,效果很好。也谢谢你提供的细节,我现在明白了。
      import java.util.Arrays;
      
      public class Test 
      {
         public static void main(String[] args)
         {
              String content = "aba(2)bb(52)gc(4)d(2)fe(14)f(6)g(8)h(4)5(6)";
              String[] a = content.replaceAll("[a-g](\\([0-9]*\\))?|[a-g]", "$0:").split(":");
              // $0 is the string which matched the regex
      
              System.out.println(Arrays.toString(a));
      
         }
      
      }
      
      [a, b, a(2), b, b(52), g, c(4), d(2), f, e(14), f(6), g(8), h(4)5(6)]