匹配“[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](?!])
@Thefourthbird 的答案有效,但需要重复主要模式 abc
,这与鼓励大多数人遵循的 DRY principle 背道而驰。
为了最大限度地提高代码重用率,一种方法是使用捕获组来捕获 [abc]
,然后以负向后视模式使用它,以确保其前面不会都带有 [
然后是 ]
:
(\[abc])(?<!\[(?=]))
请注意,这适用于 C#,因为 .NET 恰好支持可变长度后视模式,而许多其他正则表达式引擎不支持这种模式。
我正在尝试匹配 [abc]
除非它被 []
从两侧“转义”(因此 [[abc]]
被认为是转义的,而不是 [[abc]
或[abc]]
).
我能找到的最接近的东西是 Match "ABC" from *ABC*, but not from **ABC** 中的 (?<!\[)\[abc\](?!\])
,但如果它只从一侧转义,它会忽略匹配。
前瞻可以在左边,也可以在右边,以允许在左边或右边有一个后括号,但不能在另一边有一个双方括号。
(?<!\[)\[abc]|\[abc](?!])
@Thefourthbird 的答案有效,但需要重复主要模式 abc
,这与鼓励大多数人遵循的 DRY principle 背道而驰。
为了最大限度地提高代码重用率,一种方法是使用捕获组来捕获 [abc]
,然后以负向后视模式使用它,以确保其前面不会都带有 [
然后是 ]
:
(\[abc])(?<!\[(?=]))
请注意,这适用于 C#,因为 .NET 恰好支持可变长度后视模式,而许多其他正则表达式引擎不支持这种模式。