3

我想创建一个匹配不匹配的右方括号的正则表达式。例子:

]ichael ==> match ]

[my name is Michael] ==> no match

我的文本中没有嵌套的方括号对。

我试图为此使用负面的lookbehind,更具体地说,我使用了这个正则表达式:(?<!\[(.)+)\]但它似乎没有奏效。

有什么建议么?

4

4 回答 4

3

除非您使用的是 .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,最简单的解决方案是

(?<!\[[^\[\]]*)\]

在这里,我们在重复中使用非括号字符,这样我们就不会越过第一个字符[]遇到左侧。

于 2013-07-01T13:15:28.033 回答
2

您根本不需要环视(并且很难使用它大多数语言不允许无限长度的后视断言):

((?:\[[^\[\]]*]|[^\[\]]*)*+)\]

将匹配任何以右括号结尾的文本,除非它之前有相应的左括号。它不(并且根据您的问题不需要)处理嵌套括号。

]可以在其中找到之前的部分,$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 ]
于 2013-07-01T13:15:36.397 回答
0

这应该这样做:

'^[^\[]*\]'

基本上说选择任何在它和行首之间没有开放方括号的右方括号。

于 2013-07-01T13:27:27.763 回答
-1
\](.*)

将匹配之后的所有内容]

]ichael -> ichael
[my name is Michael] ->
于 2013-07-01T13:20:53.513 回答