如果前面没有一组,则尝试匹配序列,但如果前面有另一组,则尝试匹配

Trying to match a sequence if not preceded by one group, but yes if preceded by another

这有点元,但我正试图找出一个正则表达式来匹配正则表达式以用于语法突出显示。有一个很长的背景故事,但为了简洁起见,我将跳过它。这是我正在尝试做的事情:我需要匹配一个注释(前面是 # 并在行尾终止)只有当它是 not 在一个字符内class ([...]),尽管如果行中前面有一个完整的(闭合的)字符 class,它应该匹配。

复杂的因素是转义方括号——而在该行前面的普通 [ 后面没有结束 ] 表明我们仍在字符 class ,因此是非法的,可以存在转义括号 \[,无论是否存在右转义括号 \].

也许一些示例会有所帮助。以下是评论 应该 匹配的一些实例:

这是一个 "attempted comment" 不应 匹配的示例:

[A-Za-z # letters
 0-9_-.] # numbers and other characters

(第一行不要匹配,第二行可以)

我绝不是正则表达式大师(这就是我问这个问题的原因!),但我尝试摆弄正面和负面的回顾,并试图嵌套它们,但我已经零运气除了

(?<!\[)((#+).*$)

仅当前面没有左方括号时才匹配评论。但是,一旦我开始嵌套环视,并尝试匹配开场白之前是否有转义,我就被难住了。任何帮助都会……有帮助。

我认为你是这个意思,

^\[[^\]]*\].*#.*$|#(.*)$

DEMO

^\[[^\]]*\].*#.*$(*SKIP)(*F)|#.*$

它相当简单,但适用于您示例中的案例。所以试试这个:

(?<=[\][)]\s)(#(.*))$

DEMO

只有在右括号和 space 前面才匹配注释。

编辑

因为我认为你的情况要复杂得多,所以也许试试这个:

^(?=(?:[-\w\d?*.+|{}\\/\s<>\]]|(?:\[\[\]()]))+(#+.*)$)|^(?=^[\[(].+?[\])]\s*(#+.*)$)

DEMO

它只会按组进行匹配(它根本不匹配任何文本,因为它只使用正面前瞻,但分组是允许环视的)。或者如果你想直接匹配,匹配更多的文本,然后用类似这样的组来得到你想要的:

^(?:(?:[-\w\d?*.+|{}\\/\s<>\]])|(?:\[\[\]()])|^[\[(].+?[\])])+\s*(#+.*)$

DEMO

然而,在这两种情况下,您可能需要将正则表达式中出现的更多字符添加到第一个备选 (?:[-\w\d?*.+|{}\\/\s<>\]])。例如,如果您希望它也匹配 (\[ # works if escaped [ is in group 中的注释,您需要将 ( 添加到替代项中。但我不确定这是不是你想要的。

编辑"invalid scope"

试试:

^(?:(?:[-\w\d?*.+|{}\\/\s<>\]\(])|(?:\[\[\]()])|^[\[(].+?[\])])+\s*(?<valid>(?:#+).*)$|^[-\[\w\d?*.+|{}\\/\s<>\(]+(?<invalid>(?:#+).*)$

DEMO