我有一个多行字符串,如下所示:
END IF;
EXECUTE IMMEDIATE ' CREATE INDEX #idx1
ON somename ( row_id,
something)';
IF v_sys_error 0 THEN
GOTO SQL_ERROR;
END IF;
我希望以粗体显示该部分(意味着从EXECUTE IMMEDIATE到下一个分号。
我有以下正则表达式,但如何更改它以使用多行?
(EXECUTE).*;
答案 0 :(得分:55)
(?m)使正则表达式多行 - 允许你使用字符串运算符的开头(^)和结束($):
/(?m)(EXECUTE).*?;/
(?s) - dotall标志 - 使正则表达式匹配换行符。 (点)运营商:
/(?s)(EXECUTE).*?;/
答案 1 :(得分:9)
以下内容适用于Groovy。
def s = """
END IF;
EXECUTE IMMEDIATE ' CREATE INDEX #idx1
ON somename ( row_id,
something)';
IF v_sys_error <> 0 THEN
GOTO SQL_ERROR;
END IF;
"""
def expect = """
EXECUTE IMMEDIATE ' CREATE INDEX #idx1
ON somename ( row_id,
something)';
""".trim()
def exe = s =~ /(?ms)(EXECUTE.*?;)/
assert expect == exe[0][1]
答案 2 :(得分:6)
我有同样的问题,另外两个回答指出了正确的方向。在这种特殊情况下,您希望能够使用跨越多行的模式(和选择组),即您希望点也匹配换行符。默认行为与换行符不匹配。这就是你需要使用dotall(s)标志的原因:
/(?s)(EXECUTE).*?;/
这是你在groovy模式中指定标志的方法。
为了测试不同的模式和标志,我发现RegExr非常有用。