匹配“[abc]”、“[[abc]”、“[abc]]”,但不匹配“[[abc]]”,

Match "[abc]", "[[abc]", "[abc]]", but not "[[abc]]",

我正在尝试匹配 [abc] 除非它被 [] 从两侧“转义”(因此 [[abc]] 被认为是转义的,而不是 [[abc][abc]]).

我能找到的最接近的东西是 Match "ABC" from *ABC*, but not from **ABC** 中的 (?<!\[)\[abc\](?!\]),但如果它只从一侧转义,它会忽略匹配。

前瞻可以在左边,也可以在右边,以允许在左边或右边有一个后括号,但不能在另一边有一个双方括号。

(?<!\[)\[abc]|\[abc](?!])

Regex demo

@Thefourthbird 的答案有效,但需要重复主要模式 abc,这与鼓励大多数人遵循的 DRY principle 背道而驰。

为了最大限度地提高代码重用率,一种方法是使用捕获组来捕获 [abc],然后以负向后视模式使用它,以确保其前面不会都带有 [ 然后是 ]:

(\[abc])(?<!\[(?=]))

Demo

请注意,这适用于 C#,因为 .NET 恰好支持可变长度后视模式,而许多其他正则表达式引擎不支持这种模式。