在Groovy中多行的正则表达式

时间:2009-09-01 17:21:54

标签: regex groovy

我有一个多行字符串,如下所示:

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).*;

3 个答案:

答案 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非常有用。