1

我有这种类型的子串

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类)的各个部分(函数,类,但不是任何循环)转换为不同的子字符串......
我读了这个正则
表达式来获取花括号之间的字符串“{我想要大括号}之间是什么”
,但它只能在一对'{'和'}'之间获取数据,而不计算第一个之后的'{'。
我没有完整的代码,但有一些关于如何进行的方向???

4

4 回答 4

2

虽然这不是使用 RegEx 完美完成的,但使用堆栈总是更好。

但它只需要一个 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 «\}»
    -->
于 2012-09-13T04:50:37.140 回答
0

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

  1. 扫描给定输入字符串的字符
  2. 如果 char 是 { 将 char 位置推入堆栈,
  3. 否则,如果 char 是 } 从堆栈弹出位置并取 substring(poped_postion, current_position) 作为SS#
  4. goto 1(扫描下一个字符,直到字符串中剩下字符)
于 2012-09-13T04:49:28.853 回答
0

使用正则表达式将很难做到这一点。我建议你用换行符和一些简单的规则来分割这个结构来创建一个 HashMap-s 的数据结构。字符串 2 将是键,但它没有任何价值。String3 将是下一个键,它的值将是下面花括号中的内容,以 { 开头的行开始,以 } 开头的行结束。

于 2012-09-13T04:50:55.013 回答
-1

试试这个正则表达式来匹配{string},

\{(.*)\}
于 2012-09-13T04:47:25.953 回答