当包含特定字符串时,正则表达式提取连续的单行注释

时间:2013-09-30 16:39:03

标签: java regex

考虑如下的SQL文件,其中包含许多单行注释:

-- I'm a little teapot
<<< not a comment >>>
-- some random junk
-- random Mary had a
-- little lamb random
-- more random junk
<<< not a comment >>>

使用正则表达式,我希望匹配字符串Mary.*?lamb并提取所有连续(上方和下方)单行注释。

预期输出为:

-- some random junk
-- random Mary had a
-- little lamb random
-- more random junk

我沿着这些路线尝试了一些东西,但没有运气。

(--[\S\t\x20]*\n)*?(--[\S\t\x20]*?Mary.*?lamb[\S\t\x20]*?\n)(--[\S\t\x20]*\n)*

1 个答案:

答案 0 :(得分:1)

也许你可以尝试这样的事情:

^((?:--(?:(?!Mary)[^\n])*[\r\n]{1,2})*)(--[^\n]+?Mary[\s\S]+?lamb[^\n]+[\r\n]{1,2})((?:--(?:(?!Mary)[^\n])*[\r\n]{1,2})*)

regex101 demo

既然它是Java,你可能需要在上面的正则表达式之前添加一些反斜杠才能使它工作:

^((?:--(?:(?!Mary)[^\\n])*[\\r\\n]{1,2})*)(--[^\\n]+?Mary[\\s\\S]+?lamb[^\\n]+[\\r\\n]{1,2})((?:--(?:(?!Mary)[^\\n])*[\\r\\n]{1,2})*)

我正在使用[\\r\\n]{1,2},因为我无法确定该文件是仅包含\n,还是仅包含\r\r\n,因此它会在所有情况下工作(虽然它可以连续匹配两个换行符,但是--可以使其正常)。