1

我现在正在研究一些正则表达式来隔离带括号的代码,例如......

Regex: /\[(.*?)\]/

String: "<strong>[name]</strong>
<a href="http://www.example.com/place/[id]/">For more info...</a>"

Matched Fields: name, id

我希望使它更先进一点。我要做什么...

String: "[if:name <strong>[name]</strong>]
<a href="http://www.example.com/place/[id]/">For more info...</a>"

Matched Fields: if:name <strong>[name]</strong>, id

问题是,我想不出任何适用于此的正则表达式。我很确定我已经度过了一天中的大部分时间,而且我觉得我已经很接近了。

这就是我目前没有做我想做的事情......

/\[([^\]]+)\]/

有人有想法么?

4

4 回答 4

2

PHP 支持递归语法(如(?R)),所以你可以使用这个正则表达式:

\[((?:[^\[\]]+|(?R))+)\]

正则表达式101演示

结果是:if:name <strong>[name]</strong>,id

(?R)是整个正则表达式的重复,因此是“递归的”。其他字符应该很容易理解,如果不是,regex101 提供了对 regex 组件的相当全面的描述:)

于 2013-09-06T21:27:28.830 回答
0

而不是为 html 等使用正则表达式,它更容易解析文件。不确定您使用的是什么语言,所以我将举一个 Java 解析器的示例。 JSoup允许您使用 CSS 选择器访问文档。让事情变得如此简单!看看教程等,看看是否更容易。

正则表达式既好又强大,不要误会我的意思,但请尝试一下解析器。

于 2013-09-06T21:27:59.607 回答
0
\[(.*)\]

正则表达式可视化

在 Debuggex 上实时编辑

于 2013-09-06T21:30:15.807 回答
0

如果您只想要平衡括号和/或内部括号的递归核心,这可能会有所帮助。可以完成许多嵌套级别。这只是一个可能更复杂的使用的框架。平衡的文本部分实际上更容易。

 # (?:(?>[^\\\[\]]+|(?:\\[\S\s])+)|(?>\[((?:(?&core)|))\]())|([\[\]])())(?:\2|\4)(?(DEFINE)(?<core>(?>[^\\\[\]]++|(?:\\[\S\s])++|\[(?:(?&core)|)\])+))

 (?:
      (?>
           [^\\\[\]]+ 
        |  
           (?: \\ [\S\s] )+
      )
   |  
      (?>
           \[
           (                       # (1) core content
                (?:
                     (?&core) 
                  |  
                )
           )
           \]
           ( )                     # (2) core flag
      )
   |  
      # unbalanced '[' or ']'
      ( [\[\]] )                   # (3) error content
      ( )                          # (4) error flag
 )

 (?: \2 | \4 )            # only let match if core flag or error flag is set
                          # this filters search to square brackets only
 (?(DEFINE)
      # core
      (?<core>
           (?>
                [^\\\[\]]++ 
             |  
                (?: \\ [\S\s] )++
             |  
                \[
                # recurse core
                (?:
                     (?&core) 
                  |  
                )
                \]
           )+
      )
 )


 # Perl sample, but regex should be valid in php
 # ----------------------------
 # use strict;
 # use warnings;
 # 
 # 
 # $/ = "";
 # 
 # my $data = <DATA> ;
 # 
 # parse( $data ) ;
 # 
 # 
 # sub parse
 # {
 #      my( $str ) = @_;
 #      while 
 #      (
 #           $ str =~ /
 #               (?:(?>[^\\\[\]]+|(?:\\[\S\s])+)|(?>\[((?:(?&core)|))\]())|([\[\]])())(?:\2|\4)(?(DEFINE)(?<core>(?>[^\\\[\]]++|(?:\\[\S\s])++|\[(?:(?&core)|)\])+))
 #           /xg 
 #      )
 #      
 #      {
 #           if ( defined $1 )
 #           {
 #                print "found core \[$1\] \n";
 #                parse( $1 ) ;
 #           }
 #           if ( defined $3 )
 #           {
 #                print "unbalanced error '$3' \n";
 #           }
 #           
 #      }     
 # }
 # __DATA__
 # 
 # this [ [ is a test
 # [ outter [ inner ] ]
于 2013-09-06T23:19:01.880 回答