1

我有一个从以前的 SO 问题中提供的方便的正则表达式:

$regex = qr/
    (sp\s+              #start with 'sp'        
    \{                  #opening brace
      (                 #save to $2
         (?:            #either
            \{ (?-1) \} #more braces and recurse
            |           #or
            [^{}]++     #non-brace characters
         )*             #0 or more times
      )                 #end $2
    \}                  #ending brace
    )                   #end $1
    /x;

我使用它从格式为 的文件中提取文本结构sp {},并可能进一步嵌套花括号。它正确地将以下文本保存在 $1 中:

sp {foo {bar} baz}

但是我遇到了一个问题:引用。在我的文本中,竖线可以用来引用:

sp {foo |}}}}bar}}}{{|}

整个事情是一个结构,但我当前的正则表达式只会 match sp {foo |}。事情变得更加复杂,因为可以使用反斜杠在引号内转义竖线:

sp {foo |}\|bar|}

也应该匹配。有没有人对如何加强这个正则表达式来处理引号和引号转义有任何想法?

4

2 回答 2

1

查看像 Text::Balanced 这样的 CPAN 模块。

于 2012-10-05T18:48:44.993 回答
1

代替

[^{}]

(?: [^|{}]++
|   \| (?: [^\\|]++ | \\. )*+ \|
)
于 2012-10-05T18:50:19.987 回答