1

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

[复杂的因素是转义方括号 - 而行中前面没有后跟关闭的纯文本]表示我们仍在字符类中,因此是非法的,\[可能存在转义括号,无论是否存在关闭转义括号\]

也许一些例子会有所帮助。以下是一些匹配注释的情况:

  • (\h{8}-\h{4}-\h{4}-\h{4}-\h{12}) # match UUID(根本没有方括号)
  • ([A-Za-z_][A-Za-z0-9_]*) # valid Python identifier(成对的非转义方括号)
  • (\||\[|\?) # match some stuff(转义的左方括号)

以下是不应匹配“尝试的评论”的示例:

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

(第一行不应该匹配,第二行就可以了)

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

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

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

4

2 回答 2

2

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

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

演示

仅当前面有右括号和空格时,它才匹配注释。

编辑

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

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

演示

它将仅按组匹配(它根本不匹配任何文本,因为它仅使用正向前瞻,但允许分组是环视)。或者,如果您想直接匹配,请匹配更多文本,然后使用以下组获取您想要的内容:

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

演示

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

编辑“无效范围”

尝试:

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

演示

于 2015-09-10T14:54:34.470 回答
0

认为你的意思是,

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

演示

或者

^\[[^\]]*\].*#.*$(*SKIP)(*F)|#.*$
于 2015-09-10T14:12:36.883 回答