如何创建一个匹配正则表达式的字符串?

时间:2012-03-07 16:19:22

标签: php regex formatting match

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

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

任何人都可以创建一个与此匹配的示例,也许可以解释他是如何得到它的。我被困在了'。'。

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

由于

3 个答案:

答案 0 :(得分:3)

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

因此,(?:\#|/)表示“#/”。

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

把它放在一起,一个可能的字符串是这样的:

'{[/abcd asdfasefasdc]}'

答案 1 :(得分:3)

有关一些有用的工具,请参阅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]

答案 2 :(得分: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 = '/# {[#\/}       '
===========