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

时间:2018-10-31 22:00:47

标签: 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)] < / p>

以下是规则,它可以接受字母 a到g ,也可以是单独的字母,但是如果后面带有括号,则必须包括它们及其内容。括号的内容必须为数字

这是我尝试过的:

brew doctor

这是输出

  

(2)

     

(52)

     

(4)(2)

     

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

谢谢。

4 个答案:

答案 0 :(得分:1)

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

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, b, a(2), b, b(52), g, c(4), d(2), f, e(14), f(6), g(8)]

请参见Java demoregex demo

模式详细信息

  • [a-g]-从ag的一封信
  • (?:\(\d+\))?-一个可选的非捕获组,匹配出现1或0次
    • \(-一个(字符
    • \d+-1个以上数字
    • \)-一个)字符。

答案 1 :(得分:1)

如果您只想使用split方法,这也是您可以遵循的方法,

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)]

注意:此方法仅适用于在输入字符串中不存在的定界符。例如,我选择一个冒号是因为我认为它不会成为输入字符串的一部分。

答案 2 :(得分:0)

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

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

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

Regular expression visualization

Debuggex Demo

答案 3 :(得分:0)

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

  • [a-g]:需要从a到g的字母
  • (\(.*?\))?()之间的任意字符,尽可能少地匹配

您可以查看预期的输出here

此答案基于Pattern,例如:

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
b
a(2)
b
b(52)
g
c(4)
d(2)
f
e(14)
f(6)
g(8)

编辑:使用[a-g](?:\((.*?)\))?还可以轻松提取括号的内部值:

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