java - 如何编写一个可以匹配整个函数的正则表达式 @Prompt (…) 无论在 () 内写什么,即使它包含另一个 ()

标签 java sql regex

例如,我想替换 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/

相关文章:

java - 使用 jsoup 获取验证码图像

mysql - SQL查询从相关记录、子查询中获取最小值

sql - T-SQL : How to log erroneous entries during import

javascript - 将 PHP 中的正则表达式转换为 javascript

java - 这是什么迷宫求解算法?

java - 将 java BigDecimal 中的 6.51 更改为 6.50

java - 如何制作一个像回收站一样的Android应用程序?

sql - UPPER 和 to_char 函数未定义

python - unicode 字符串的正则表达式

sql - SELECT FROM Table WHERE 不是部分的确切数字在字符串 SQL 中