40

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

END IF;

EXECUTE IMMEDIATE ' CREATE INDEX #idx1
      ON somename ( row_id,
                           something)';
   IF v_sys_error  0 THEN
      GOTO SQL_ERROR;

   END IF;

我希望以粗体捕获部分(意思是从立即执行到下一个分号的所有内容。

我有以下正则表达式,但如何将其更改为使用多行?

(EXECUTE).*;
4

3 回答 3

75

(?m) 使正则表达式成为多行 - 允许您匹配字符串运算符的开头 (^) 和结尾 ($)(在这种情况下,匹配单个行的开头和结尾,而不是整个字符串):

/(?m)(EXECUTE).*?;/

(?s) - dotall 标志 - 使正则表达式与换行符匹配。(点)运算符:

/(?s)(EXECUTE).*?;/
于 2009-09-01T17:41:11.630 回答
10

以下应该在 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]
于 2009-09-01T20:09:58.333 回答
8

我有同样的问题,另外两个答案为我指明了正确的方向。在这种特殊情况下,您希望能够使用跨越多行的模式(并选择组),即您希望点也匹配换行符。默认行为与换行符不匹配。这就是您需要使用 dotall (s) 标志的原因:

/(?s)(EXECUTE).*?;/

这就是您在 groovy 模式中指定标志的方式。

为了测试不同的模式和标志,我发现RegExr非常有用。

于 2012-10-03T05:05:44.457 回答