正则表达式找出Java中花括号内的子串

时间:2012-09-13 04:30:00

标签: java regex substring curly-braces

我有这种类型的子串

string 1
{
    string 2
    string 3
    {
        string 4
        string 5
    }
    string 6
    {
        string 7
        string 8
    }
    string 9
    {
        string 10
        string 11
        string 12
        {
            string 13
            string 14
        }
        string 15
    }
}
string 16
string 17

所以基本上我有java类结构
现在我想要一段代码可以让我跟踪子串(SS#)
SS1:

        string 4
        string 5

SS2:

        string 7
        string 8

SS3:

            string 13
            string 14

SS4:

string 16
string 17

SS5:

        string 10
        string 11
        string 12
        {
            string 13
            string 14
        }
        string 15

SS6:

    string 2
    string 3
    {
        string 4
        string 5
    }
    string 6
    {
        string 7
        string 8
    }
    string 9
    {
        string 10
        string 11
        string 12
        {
            string 13
            string 14
        }
        string 15
    }

所以基本上我想要一段代码,可以将字符串(java类)的各种部分(函数,类,但不是任何循环)转换为不同的子字符串...
我读了这篇 Regex to get string between curly braces "{I want what's between the curly braces}"
但它只能在一对'{'和'}'之间获取数据,而不计算在第一个之后的'{'。 我不是完整的代码,而是如何进行的一些方向???

4 个答案:

答案 0 :(得分:2)

虽然使用RegEx并不完美,但最好使用stack

但它只需要一个RegEx解决方案,然后它可能会起作用(并非总是如此):

(?is)\{[^}]*?\}(?=.*?\})

<强>解释

<!--

    (?is)\{[^}]*?\}(?=.*?\})

    Match the remainder of the regex with the options: case insensitive (i); dot matches newline (s) «(?is)»
    Match the character “{” literally «\{»
    Match any character that is NOT a “}” «[^}]*?»
       Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
    Match the character “}” literally «\}»
    Assert that the regex below can be matched, starting at this position (positive lookahead) «(?=.*?\})»
       Match any single character «.*?»
          Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
       Match the character “}” literally «\}»
    -->

答案 1 :(得分:0)

我不知道这是一个正则表达式,但我可以建议另一个解决方案: 我只是在编写sudo代码:

  1. 扫描给定输入字符串的字符
  2. 如果char是{push char position to stack,
  3. else if char is} pop from stack并将substring(poped_postion,current_position)改为SS#
  4. 转到1(扫描下一个字符,直到字符串中还剩下字符)

答案 2 :(得分:0)

使用正则表达式执行此操作非常困难。我建议您通过新行和一些简单的规则来拆分这个结构,以创建HashMap的数据结构。字符串2将是键,但它没有任何值。 String3将是下一个键,它的值将是下面的花括号中的东西,从以{开头的行开头,以以}开头的行开头。

答案 3 :(得分:-1)

尝试使用此正则表达式匹配{string}

\{(.*)\}