更改正则表达式以避免引用的标记

时间:2012-10-05 18:35:48

标签: regex perl quote

我从previous SO question提供了一个方便的正则表达式:

$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}}}{{|}

整个事情是一个结构,但我现有的正则表达式只匹配sp {foo |}。事情进一步复杂化,因为垂直条可以在引号内转义 使用反斜杠:

sp {foo |}\|bar|}

也应该匹配。有没有人对如何使用这个正则表达式来处理报价并引用转义有任何想法?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

替换

[^{}]

(?: [^|{}]++
|   \| (?: [^\\|]++ | \\. )*+ \|
)