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

5

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

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

有人能否创建一个符合此要求的示例,并可能解释一下如何实现。我在'?'处卡住了。

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

谢谢

3个回答

3

查看开源RegexBuddy替代品在线正则表达式测试工具获取一些有用的工具。最好先让它们解释一下正则表达式。我在这里使用了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
----------------------------------------------------------------------
  \]                       ']'
----------------------------------------------------------------------

这是在假定您的示例中的{}正则表达式分隔符的情况下。
您可以仅阅读解释列表并想出可能的源字符串,例如:
 [#NOSPACE NOBRACKET]

3
(?:...)(...)具有相同的分组效果,但不会“捕获”组的内容;请参见http://php.net/manual/en/regexp.reference.subpatterns.php
因此,(?:\#|/)表示“要么是#,要么是/”。
我猜你知道[^ ]*的意思是“零个或多个非空格字符”,而[^]]*的意思是“零个或多个非右方括号字符”。
将它们组合起来,可能得到以下字符串:
'{[/abcd asdfasefasdc]}'

它可以工作了...非常感谢您的解释和文档。 - user1236048

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 = '/# {[#\/}       '
===========

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接