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

4

我正在尝试拆分这个字符串:

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);
        }

这里是输出结果

(2)

(52)

(4) (2)

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

谢谢。

4个回答

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演示和一个正则表达式演示

模式细节

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

1
谢谢,它运行得很好。还有谢谢你提供的详细信息,我现在明白了。 - Charles Morin

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

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

0

使用Split方法并不是解决这个问题的正确方法,因为很难消除错误的条目。

只需使用"match"方法,找到所有有效的匹配项并处理结果数组即可:

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

Regular expression visualization

Debuggex演示


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 
}

它确实符合所需的模式...但这不能与split一起使用。 - mettleap
@mettleap 你说得对,我添加了更多细节来描述我是如何解决这个问题的。感谢您指出! - Glains

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