这得到了一些元数据,但我正试图找出一个正则表达式来匹配正则表达式,以实现语法突出显示的目的。有一个好长的背景故事,但为了简洁起见,我会跳过它。下面是我要做的:我需要匹配一个注释(前面是#,在行尾结束),只有在字符类([...])中是而不是时,才需要匹配,但是如果该行前面有一个完整的(关闭的)字符类,则应该匹配它。
更复杂的因素是转义方括号--尽管行前面的普通[没有后面跟着结束的]表示我们仍然处于字符类中,因此是非法的,可以存在转义括号\[,也可以不存在结束转义括号\]。
也许一些例子会有帮助。下面是注释应该与匹配的一些实例:
(\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(第一行不应该匹配,第二行很好)
我绝不是一个裁判大师(这就是我问这个问题的原因!),但我试着在背后摆弄正反两面,试图筑巢,但我没有任何运气,除了
(?<!\[)((#+).*$)它只与注释匹配,如果前面没有开头的方括号。不过,一旦我开始筑巢围观犬,并试图匹配,如果开局之前有一次逃脱,我被难住了。任何帮助都是..。很有帮助。
发布于 2015-09-10 14:54:34
这是相当简单的,但在工作的情况下,从你的例子。所以试试这个:
(?<=[\][)]\s)(#(.*))$只有在前面加上括号和空格的情况下,它才匹配注释。
编辑
我认为你的情况要复杂得多,所以不妨试试这个:
^(?=(?:[-\w\d?*.+|{}\\\/\s<>\]]|(?:\\[\[\]()]))+(#+.*)$)|^(?=^[\[(].+?[\])]\s*(#+.*)$)它将只按组匹配(它根本不匹配任何文本,因为它只使用积极的展望,但是分组是允许的)。或者,如果您想直接匹配,则匹配更多文本,然后使用以下内容的组获得所需的内容:
^(?:(?:[-\w\d?*.+|{}\\\/\s<>\]])|(?:\\[\[\]()])|^[\[(].+?[\])])+\s*(#+.*)$但是,在这两种情况下,您可能都需要添加更多出现在正则表达式中的字符,以便第一个替代的(?:[-\w\d?*.+|{}\\\/\s<>\]])。例如,如果希望它与(\[ # works if escaped [ is in group中的注释相匹配,则需要将(添加到alternative中。但我不确定这是不是你想要的。
编辑“无效范围”
试着:
^(?:(?:[-\w\d?*.+|{}\\\/\s<>\]\(])|(?:\\[\[\]()])|^[\[(].+?[\])])+\s*(?<valid>(?:#+).*)$|^[-\[\w\d?*.+|{}\\\/\s<>\(]+(?<invalid>(?:#+).*)$发布于 2015-09-10 14:12:36
https://stackoverflow.com/questions/32504084
复制相似问题