为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼唤远方 2021-12-22 16:01:09
我正在尝试拆分此字符串: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)谢谢。
查看完整描述

3 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

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


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]- 一封来自a于的信g

  • (?:\(\d+\))? - 一个可选的非捕获组匹配 1 或 0 次出现

    • \(- 一个(字符

    • \d+ - 1+ 位数字

    • \)- 一个)字符。


查看完整回答
反对 回复 2021-12-22
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

如果你只想使用 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)]

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


查看完整回答
反对 回复 2021-12-22
?
阿晨1998

TA贡献2037条经验 获得超6个赞

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


[a-g]: 需要从 a 到 g 的字母

(\(.*?\))?:(和之间的任何字符),尽可能少地匹配

您可以在此处查看预期的输出。


这个答案基于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 

}


查看完整回答
反对 回复 2021-12-22
  • 3 回答
  • 0 关注
  • 412 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号