Omn*_*ent 37 regex groovy multiline
我有一个多行字符串如下:
END IF;
EXECUTE IMMEDIATE ' CREATE INDEX #idx1
ON somename ( row_id,
something)';
IF v_sys_error 0 THEN
GOTO SQL_ERROR;
END IF;
Run Code Online (Sandbox Code Playgroud)
我希望以粗体显示该部分(意味着从EXECUTE IMMEDIATE到下一个分号的所有内容.
我有以下正则表达式,但如何更改它以使用多行?
(EXECUTE).*;
Run Code Online (Sandbox Code Playgroud)
Nos*_*ama 61
(?m)使正则表达式多行 - 允许您使用字符串运算符的开头(^)和结束($):
/(?m)(EXECUTE).*?;/
Run Code Online (Sandbox Code Playgroud)
(?s) - dotall标志 - 使正则表达式匹配换行符.(点)运营商:
/(?s)(EXECUTE).*?;/
Run Code Online (Sandbox Code Playgroud)
以下应该在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]
Run Code Online (Sandbox Code Playgroud)
我有同样的问题,另外两个回答指出了正确的方向.在这种特殊情况下,您希望能够使用跨越多行的模式(和选择组),即您希望点也匹配换行符.默认行为与换行符不匹配.这就是你需要使用dotall(s)标志的原因:
/(?s)(EXECUTE).*?;/
Run Code Online (Sandbox Code Playgroud)
这是你在groovy模式中指定标志的方法.
为了测试不同的模式和标志,我发现RegExr非常有用.
| 归档时间: |
|
| 查看次数: |
19623 次 |
| 最近记录: |