【问题标题】:Split string array in Java using regex使用正则表达式在Java中拆分字符串数组
【发布时间】:2018-10-31 22:00:46
【问题描述】:

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

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)

谢谢。

【问题讨论】:

    标签: java arrays regex split


    【解决方案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 位以上
      • \) - 一个 ) 字符。

    【讨论】:

    • 谢谢它运行良好。也谢谢你的详细信息,我现在明白了。
    【解决方案2】:

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

    Regex : [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)]
    

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

    【讨论】:

      【解决方案3】:

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

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

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

      Debuggex Demo

      【讨论】:

        【解决方案4】:

        您可以尝试以下正则表达式:[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 
        }
        

        【讨论】:

        • 它确实匹配所需的模式......但这不适用于拆分
        • @mettleap 你说得对,我添加了更多细节来描述我是如何解决问题的。谢谢指出!
        猜你喜欢
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 1970-01-01
        • 2014-04-22
        • 2011-10-16
        • 1970-01-01
        相关资源
        最近更新 更多