我正在尝试为Qiskit Terra编写一个 Prettify风格的语法荧光笔(它紧跟 Python 语法)。显然,Prettify 使用了 Javascript 风格的正则表达式。例如,是对应于Q#中有效字符串的正则表达式。基本上,我正在尝试为 Python 组合等效的正则表达式。/^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"'
现在,我知道 Python 支持三引号内的字符串,即'''<string>'''
并且"""<string>"""
是有效字符串(这种格式特别用于docstrings)。为了处理这种情况,我将相应的捕获组编写为:
(^\'{3}(?:[^\\]|\\[\s\S])*(?:\'{3}$))
这是regex101 链接。
除了在某些情况下,这可以正常工作,例如:
''' 'This "is" my' && "first 'regex' sentence." ''' &&
''' 'This "is" the second.' '''
很明显,它应该被''' 'This "is" my' && "first 'regex' sentence." '''
视为一个字符串和''' 'This "is" the second.' '''
另一个字符串。但是不,我编写的正则表达式将整个内容组合为一个字符串(检查regex101 链接)。也就是说,即使遇到a '''
(对应'''
开头的the)也不会结束字符串。
我应该如何修改正则表达式(^\'{3}(?:[^\\]|\\[\s\S])*(?:\'{3}$))
以考虑这种情况?我知道这一点:如何在正则表达式中匹配“直到这个字符序列的任何内容”?但这并不能完全回答我的问题,至少不能直接回答。