我想创建一个匹配不匹配的右方括号的正则表达式。例子:
]ichael ==> match ]
[my name is Michael] ==> no match
我的文本中没有嵌套的方括号对。
我试图为此使用负面的lookbehind,更具体地说,我使用了这个正则表达式:(?<!\[(.)+)\]
但它似乎没有奏效。
有什么建议么?
我想创建一个匹配不匹配的右方括号的正则表达式。例子:
]ichael ==> match ]
[my name is Michael] ==> no match
我的文本中没有嵌套的方括号对。
我试图为此使用负面的lookbehind,更具体地说,我使用了这个正则表达式:(?<!\[(.)+)\]
但它似乎没有奏效。
有什么建议么?
除非您使用的是 .NET,否则后视必须是固定长度。由于您只想检测是否有任何不匹配的右括号,因此您实际上并不需要向后看:
^[^\[\]]*(?:\[[^\[\]]*\][^\[\]]*)*\]
如果这匹配你有一个不匹配的右括号。
如果您意识到这[^\[\]]
是一个与方括号以外的任何内容匹配的否定字符类,并且如果您以自由间距模式布置它,则更容易理解:
^ # start from the beginning of the string
[^\[\]]* # match non-bracket characters
(?: # this group matches matched brackets and what follows them
\[ # match [
[^\[\]]* # match non-bracket characters
\] # match ]
[^\[\]]* # match non-bracket characters
)* # repeat 0 or more times
\] # match ]
因此,这会尝试]
在匹配 0 个或更多匹配良好的括号对之后找到一个。
请注意,和之间的部分在^
功能]
上等同于 Tim Pietzker 的解决方案(我认为这在概念上更容易理解)。我所做的是一种称为“展开循环”的优化技术。如果您的风格提供所有格量词,您可以将所有内容*
转换*+
为进一步提高效率。
关于你的尝试
即使您使用的是 .NET,您的模式的问题是.
允许您越过其他括号。因此,您将无法匹配
[abc]def]
因为第一个和第二个在他们面前]
都有一个[
地方。如果您使用的是 .NET,最简单的解决方案是
(?<!\[[^\[\]]*)\]
在这里,我们在重复中使用非括号字符,这样我们就不会越过第一个字符[
或]
遇到左侧。
您根本不需要环视(并且很难使用它大多数语言不允许无限长度的后视断言):
((?:\[[^\[\]]*]|[^\[\]]*)*+)\]
将匹配任何以右括号结尾的文本,除非它之前有相应的左括号。它不(并且根据您的问题不需要)处理嵌套括号。
]
可以在其中找到之前的部分,$1
以便您以后可以重复使用它。
解释:
( # Match and capture in group number 1:
(?: # the following regex (start of non-capturing group):
\[ # Either a [
[^\[\]]* # followed by non-brackets
\] # followed by ]
| # or
[^\[\]]* # Any number of non-bracket characters
)*+ # repeat as needed, match possessively to avoid backtracking
) # End of capturing group
\] # Match ]
这应该这样做:
'^[^\[]*\]'
基本上说选择任何在它和行首之间没有开放方括号的右方括号。
\](.*)
将匹配之后的所有内容]
:
]ichael -> ichael
[my name is Michael] ->