2009-09-01 69 views
35

多行我有一个多行字符串,像下面:正则表达式在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).*; 

回答

49

使得正则表达式多行 - 允许你使用字符串运算符的开始(^)和结尾($):

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

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

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

以下应该在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] 
4

我有同样的问题,其他两个answeres指出我在正确的方向。在这种特殊情况下,您希望能够使用跨越多行的模式(和选择组),即您希望该点也匹配换行符。默认行为与换行符不匹配。这就是为什么你需要使用dotall(s)标志:

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

这是如何指定常规模式中的标志。

对于测试不同的模式和标志,我发现RegExr相当有用。

相关问题