2012-03-07 12 views
5

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

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

任何人都可以创建一个能够匹配这个,也许解释他是如何得到它的一个例子。我被卡在'?'。

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

由于

回答

3

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

因此,(?:\#|/)的意思是“要么是#要么是/”。

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

将其组合在一起,一个可能的字符串是这样的:

'{[/abcd asdfasefasdc]}' 
+0

它的工作原理...感谢了很多的解释和文档 – 2012-03-07 16:26:12

+0

@alex:不客气! – ruakh 2012-03-07 16:26:37

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] 
1

我觉得这是一个很好的职位,以帮助设计正则表达式。虽然它相当容易编写一个普通的正则表达式来匹配一个字符串,但有时它的帮助将其设计为
。有时候有必要看看bizzar会匹配什么。

将很多元字符混合为文字时,对于便于阅读和避免错误的格式
相当重要。

下面是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 = '/# {[#\/}  ' 
=========== 
相关问题