【问题标题】:How do you create a string to match an regex?你如何创建一个字符串来匹配一个正则表达式?
【发布时间】:2012-03-25 04:50:20
【问题描述】:

我需要创建一个格式化文档。我知道用于格式化文本的正则表达式,但我不知道如何重现该正则表达式的示例。 这个应该是内部链接:

'{\[((?:\#|/)[^ ]*) ([^]]*)\]}'

任何人都可以创建一个与此匹配的示例,并解释他是如何得到它的。我卡在“?”上。

我从来没有在开头使用过这个元字符,通常我用它来标记一个文字不能出现或只出现一次。

谢谢

【问题讨论】:

    标签: php regex formatting match


    【解决方案1】:

    我认为这是帮助设计正则表达式的好帖子。虽然它很容易写一个
    用于匹配字符串的通用正则表达式,有时在之后反向查看它会很有帮助
    它的设计。有时有必要看看会匹配什么奇怪的东西。

    当将大量元字符混合为文字时,格式化相当重要
    这些是为了便于阅读和避免错误。

    这里有一些 Perl 示例(对我而言)更容易制作原型。

    my @samps = (
     '{[/abcd asdfasefasdc]}',
     '{[# ]}',
     '{[# /# \/]}',
     '{[/#  {[
        | /# {[#\/} ]}',
    ,
    );
    
    for (@samps) {
       if (m~{\[([#/][^ ]*) ([^]]*)\]}~)
       {
          print "Found: '$&'\ngrp1 = '$1'\ngrp2 = '$2'\n===========\n\n";
       }
    }
    
    __END__
    
    Expanded
    
    \{\[ 
      (
         [#/][^ ]*
      )
      [ ]
      (
         [^\]]*
      )
    \]\}
    

    输出

    Found: '{[/abcd asdfasefasdc]}'
    grp1 = '/abcd'
    grp2 = 'asdfasefasdc'
    ===========
    
    Found: '{[# ]}'
    grp1 = '#'
    grp2 = ''
    ===========
    
    Found: '{[# /# \/]}'
    grp1 = '#'
    grp2 = '/# \/'
    ===========
    
    Found: '{[/#    {[
            | /# {[#\/}     ]}'
    grp1 = '/#      {[
            |'
    grp2 = '/# {[#\/}       '
    ===========
    

    【讨论】:

      【解决方案2】:

      有关一些有用的工具,请参阅 Open source RegexBuddy alternativesOnline regex testing。首先让他们解释一个正则表达式是最简单的。我在这里使用了 YAPE:

      NODE                     EXPLANATION
      ----------------------------------------------------------------------
        \[                       '['
      ----------------------------------------------------------------------
        (                        group and capture to \1:
      ----------------------------------------------------------------------
          (?:                      group, but do not capture:
      ----------------------------------------------------------------------
            \#                       '#'
      ----------------------------------------------------------------------
           |                        OR
      ----------------------------------------------------------------------
            /                        '/'
      ----------------------------------------------------------------------
          )                        end of grouping
      ----------------------------------------------------------------------
          [^ ]*                    any character except: ' ' (0 or more
                                   times (matching the most amount
                                   possible))
      ----------------------------------------------------------------------
        )                        end of \1
      ----------------------------------------------------------------------
                                 ' '
      ----------------------------------------------------------------------
        (                        group and capture to \2:
      ----------------------------------------------------------------------
          [^]]*                    any character except: ']' (0 or more
                                   times (matching the most amount
                                   possible))
      ----------------------------------------------------------------------
        )                        end of \2
      ----------------------------------------------------------------------
        \]                       ']'
      ----------------------------------------------------------------------
      

      这是假设您的示例中的{}regex delimiters

      您可以通读解释列表并想出一个可能的源字符串,例如:

       [#NOSPACE NOBRACKET]
      

      【讨论】:

        【解决方案3】:

        (?:...)(...)具有相同的分组效果,但没有“捕获”分组的内容;见http://php.net/manual/en/regexp.reference.subpatterns.php

        所以,(?:\#|/) 的意思是“#/”。

        我猜你知道[^ ]* 的意思是“零个或多个不是 SP 的字符”,而[^]]* 的意思是“零个或多个不是右方括号的字符”。

        综合起来,一个可能的字符串是这样的:

        '{[/abcd asdfasefasdc]}'
        

        【讨论】:

        • 它有效...非常感谢您的解释和文档
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-16
        • 1970-01-01
        • 2011-08-08
        • 2015-09-02
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        相关资源
        最近更新 更多