我需要创建一个格式文档。我知道用于格式化文本的正则表达式,但我不知道如何重现该正则表达式的示例。 这应该是一个内部链接:如何创建一个字符串来匹配正则表达式?
'{\[((?:\#|/)[^ ]*) ([^]]*)\]}'
任何人都可以创建一个能够匹配这个,也许解释他是如何得到它的一个例子。我被卡在'?'。
我从来没有在开头使用这个元字符,通常我用它来标记文字不能出现或只出现一次。
由于
我需要创建一个格式文档。我知道用于格式化文本的正则表达式,但我不知道如何重现该正则表达式的示例。 这应该是一个内部链接:如何创建一个字符串来匹配正则表达式?
'{\[((?:\#|/)[^ ]*) ([^]]*)\]}'
任何人都可以创建一个能够匹配这个,也许解释他是如何得到它的一个例子。我被卡在'?'。
我从来没有在开头使用这个元字符,通常我用它来标记文字不能出现或只出现一次。
由于
(?:...)
具有相同的分组效果(...)
,但没有“捕获”的组的内容;见http://php.net/manual/en/regexp.reference.subpatterns.php。
因此,(?:\#|/)
的意思是“要么是#
要么是/
”。
我猜你知道[^ ]*
的意思是“零个或多个不是SP的字符”,而[^]]*
的意思是“零个或多个字符不是右方括号”。
将其组合在一起,一个可能的字符串是这样的:
'{[/abcd asdfasefasdc]}'
一些有用的工具见Open source RegexBuddy alternatives和Online 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]
我觉得这是一个很好的职位,以帮助设计正则表达式。虽然它相当容易编写一个普通的正则表达式来匹配一个字符串,但有时它的帮助将其设计为
。有时候有必要看看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 = '/# {[#\/} '
===========
它的工作原理...感谢了很多的解释和文档 – 2012-03-07 16:26:12
@alex:不客气! – ruakh 2012-03-07 16:26:37