用不在括号内的逗号分隔,跳过它们内部的任何内容

时间:2015-06-23 00:09:09

标签: java regex string split

我知道它可能是关于正则表达式的另一个主题,但是尽管我搜索了它,但我无法得到明确的答案。所以这是我的问题 - 我有一个这样的字符串:

{1,2,{3,{4},5},{5,6}}

我删除了最多的外部括号(它们来自输入,我不需要它们),所以现在我有了这个:

1,2,{3,{4},5},{5,6}

现在,我需要将这个字符串拆分成一个元素数组,将这些括号中的所有内容视为一个,"无缝"元素:

Arr[0]    1
Arr[1]    2
Arr[2]    {3,{4},5}
Arr[3]    {5,6}

我尝试过使用前瞻,但到目前为止,我失败了(悲惨地)。在正则表达式方面处理这些事情的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

如果像这样的元素应该保持在一起,则不能这样做:{{1},{2}}。原因是相当于解析平衡括号语言。此语言无上下文,无法使用正则表达式进行语法分析。处理此问题的最佳方法是不使用正则表达式,而是使用带有堆栈的for循环(堆栈提供解析无上下文语言的能力)。在伪代码中我们可以做到:

for char in input
    if stack is empty and char is ','
        add substring(last, current position) to output array
        last = current index 
    if char is '{'
         push '{' on stack
    if char is '}'
         pop from stack

这个伪代码将根据需要构造数组,请注意,最好循环给定字符串中的字符索引,因为您需要这些来确定要添加的子字符串的边界到阵列。

答案 1 :(得分:1)

几乎接近要求。时间不多了。稍后会完成休息(单个逗号不正确) 正则表达式:,(?=[^}]*(?:{|$))
要检查正则表达式的有效性:转到http://regexr.com/

enter image description here

要在Java中实现此模式,存在细微差别。 \需要在{和}之前添加。

因此,Java输入的正则表达式:,(?=[^\\}]*(?:\\{|$))

String numbers = {1,2,{3,{4},5},{5,6}};
numbers = numbers.substring(1, numbers.length()-1);
String[] separatedValues = numbers.split(",(?=[^\\}]*(?:\\{|$))");
System.out.println(separatedValues[0]);

答案 2 :(得分:0)

无法找出echo "<img src= 'https://graph.facebook.com/$user_id/picture?width=50&height=40' class = 'post_dp'>"; 解决方案,但此处是非regex解决方案。它涉及在每个逗号之前解析数字(不是花括号)(除非它是字符串中的最后一个数字)和解析字符串(用花括号),直到找到该组的结束大括号。

如果找到正则表达式解决方案,我很乐意看到它。

regex

结果:

public static void main(String[] args) throws Exception {
    String data = "1,2,{3,{4},5},{5,6},-7,{7,8},{8,{9},10},11";
    List<String> list = new ArrayList();
    for (int i = 0; i < data.length(); i++) {
        if ((Character.isDigit(data.charAt(i))) ||
            // Include negative numbers
             (data.charAt(i) == '-') && (i + 1 < data.length() && Character.isDigit(data.charAt(i + 1)))) {
            // Get the number before the comma, unless it's the last number
            int commaIndex = data.indexOf(",", i);
            String number = commaIndex > -1
                    ? data.substring(i, commaIndex)
                    : data.substring(i);
            list.add(number);
            i += number.length();
        } else if (data.charAt(i) == '{') {
            // Get the group of numbers until you reach the final 
            // closing curly brace
            StringBuilder sb = new StringBuilder();
            int openCount = 0;
            int closeCount = 0;
            do {
                if (data.charAt(i) == '{') {
                    openCount++;
                } else if (data.charAt(i) == '}') {
                    closeCount++;
                }
                sb.append(data.charAt(i));
                i++;
            } while (closeCount < openCount);
            list.add(sb.toString());
        }
    }

    for (int i = 0; i < list.size(); i++) {
        System.out.printf("Arr[%d]: %s\r\n", i, list.get(i));
    }
}