【发布时间】:2020-09-23 20:19:49
【问题描述】:
我需要一个正则表达式,它将提取给定文本文件中的所有字符串函数参数。它是一个 PL/SQL 脚本文件,因此 '' 在字符串中转义了 '。
一个例子:
foo('My foo arg! Something.') --> 'My foo arg! Something.'
bar('My bar arg', number) --> 'My bar arg'
// note the spaces
foo( 'My foo arg') --> 'My foo argument'
bar( 'My bar arg', number) --> 'My bar arg'
foo(''My escaped string'') --> ''My escaped string''
bar(''My escaped string'', number) --> ''My escaped string''
我写了一个简单的模式,但它没有按预期工作:
Pattern p = Pattern.compile("[\\s]*\\([\\s]*((([']{1,2})?))(([\\w\\W&&[^']&&]*)*((([']{2})?))*)*'",
Pattern.UNICODE_CASE);
Matcher m = p.matcher(text);
编辑
有效的例子是:
-- expected: 'My foo arg! Something.'
BEGIN
foo('My foo arg! Something.');
END;
-- expected: ''My foo arg! Something.'' or 'My foo arg! Something.'
DECLARE
v_sql VARCHAR(4000) := 'SELECT foo(''My foo arg! Something.'') FROM sys.dual';
BEGIN
EXECUTE IMMEDIATE v_sql;
END;
【问题讨论】:
-
你确定你可以拥有
foo(''My escaped string'')吗?不是foo('''My escaped string''')? -
是的,我确定...
-
但你说
''表示'在'引用的子字符串中。foo(''My escaped string'')不是语法错误的例子吗? -
也许要说清楚,方法 foo 是字符串的一部分:
'SELECT foo(''My escaped string'') FROM sys.DUAL'. -
但是
'SELECT foo('My foo arg! Something.') FROM sys.dual'会无效吗?你怎么描述的,这两个例子都不对。