正则表达式 - 对除纯空格之外的任何字符进行负向回顾

Regex - negative lookbehind for any character excluding pure whitespace

我正在尝试编写一个正则表达式模式,如果前面的模式包含除纯空格以外的任何字符,则匹配失败,例如

--hello (match)
--goodbye (match)
ROW_NUMBER() OVER (ORDER BY DATE) --date (fail)
  --comment with some indentation (match)
    --another comment with some indentation (match)

我最接近的是我制作的这个图案 (?<!.)--.*\n,它给了我这个结果

--hello (match)
--goodbye (match)
ROW_NUMBER() OVER (ORDER BY DATE) --date (fail)
  --comment with some indentation (fail)
    --another comment with some indentation (fail)

我已经尝试了 (?<!\s)--.*\n(?<=\S)--.*\n 但两者都 return 根本没有匹配项

编辑:regexr.com 更清楚地说明问题 regexr.com/6j0mt

使用 PyPi regex,您可以使用

import regex

text = r"""--hello
--goodbye
ROW_NUMBER() OVER (ORDER BY DATE) --date
  --comment with some indentation
    --another comment with some indentation"""

print( regex.findall(r'(?<=^[^\S\r\n]*)--.*', text, regex.M) )
# => ['--hello', '--goodbye', '--comment with some indentation', '--another comment with some indentation']

看到这个Python demo online

或者,使用默认值 Python re:

import re
 
text = r"""--hello
--goodbye
ROW_NUMBER() OVER (ORDER BY DATE) --date
  --comment with some indentation
    --another comment with some indentation"""
 
print( re.findall(r'^[^\S\r\n]*(--.*)', text, re.M) )

参见 this Python demo

图案详情

  • (?<=^[^\S\r\n]*) - 正后视匹配紧接在 string/line 开始和零个或多个水平空格
  • 之前的位置
  • ^ - 字符串的开始(这里是一行,因为使用了 re.M / regex.M 选项)
  • [^\S\r\n]* - 除 non-whitespace、CR 和 LF 字符以外的零个或多个字符(除回车符 returns 和换行符之外的任何空格)
  • (--.*) - 第 1 组:-- 和该行的其余部分(.* 匹配除换行字符以外的零个或多个字符)。