regex over multiple lines in Groovy

孤街醉人 提交于 2020-05-24 21:04:43

问题


I have a multiple line string like following:

END IF;

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

   END IF;

I wish to capture the part in bold (meaning everything from EXECUTE IMMEDIATE to next semicolon.

I have the following regex but how can I change it to work with multiple lines?

(EXECUTE).*;

回答1:


(?m) makes the regex multiline - allows you to match beginning (^) and end ($) of string operators (in this case, to match the beginnings and ends of individual lines, rather than the whole string):

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

(?s) - dotall flag - makes the regex match newlines with . (dot) operators:

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



回答2:


The following should work in 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]



回答3:


I had the same question and the other two answeres pointed me in the right direction. In this particular case, you want to be able to use patterns (and select groups) that span multiple lines, i.e. you want the dot to also match newline characters. Default behaviour does not match newlines. That is why you need to use the dotall (s) flag:

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

This is how you specify flags in groovy patterns.

For testing different patterns and flags I found RegExr quite useful.



来源:https://stackoverflow.com/questions/1363643/regex-over-multiple-lines-in-groovy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!