例如,我想替换 SQL 查询中的任何提示函数 我用过这个表达
Query = Query.replaceAll("@prompt\\s*\\(.*?\\)", "(1)");
此表达式在此示例中有效
@Prompt('Bill Cycle','A','MIGRATION\BC',,,)
@Prompt('账单周期','A','MIGRATION\BC',,,)
输出为(1)
但是当它在此示例中不起作用时
@Prompt('Groups','A','[Lookup] Price Group (2)\Nested Group',,,)
输出是无效的(1)\Nested Group',,,)
最佳答案
遗憾的是,正如 Joe C 在评论中指出的那样,您尝试做的事情不能在任意深度括号的正则表达式中完成。原因是正则表达式无法“计数”。为此,您需要一个堆栈机,或者一个上下文无关的语言解析器。
但是,您还建议“提示”内容始终位于单引号内。我假设下面是标准的 Java regexp 库。其他正则表达式库可能需要翻译...
"@Prompt\\('[^']*'(\s*,\s*(('[^']*')|([^',)]*)))*\\)"
因此,您正在提示中搜索单引号文本 block 。搜索假定内容的每个内部位都用单引号引起来。
在https://regex101.com/r/nByy0Y/1处验证(我做了一些修复)。请注意,在 regex101.com 中,它将把双反斜杠视为文字反斜杠。相反,您想要的只是引用括号,这样您就需要一个文字括号。
关于java - 如何编写一个可以匹配整个函数的正则表达式 @Prompt (…) 无论在 () 内写什么,即使它包含另一个 (),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45643657/