Java 用于提取查询参数的正则表达式因日期时间字符串而失败

Java 用于提取查询参数的正则表达式因日期时间字符串而失败,java,regex,Java,Regex,假设使用以下SQL命令: update [TABLE] set [value] = 'UserName' where key1 = :param1 and key2 = :param2 我想从SQL中提取:param1和:param2。因此,我使用以下正则表达式来匹配SQL字符串: :([\w.$]+|"[^"]+"|'[^']+') 这可以正常工作,但当SQL字符串在引号(“)或单引号(”)之间包含冒号(:)时除外 例如,我希望正则表达式匹配器仅将:param1和:param2返回给以下查

假设使用以下SQL命令:

update [TABLE] set [value] = 'UserName' where key1 = :param1 and key2 = :param2
我想从SQL中提取
:param1
:param2
。因此,我使用以下正则表达式来匹配SQL字符串:

:([\w.$]+|"[^"]+"|'[^']+')
这可以正常工作,但当SQL字符串在引号(“)或单引号(”)之间包含冒号(:)时除外

例如,我希望正则表达式匹配器仅将
:param1
:param2
返回给以下查询:

 update [TABLE] set [value] = ':UserName' where key1 = :param1 and key2 = :param2
 update [TABLE] set [value] = 'User=:UserName' where key1 = :param1 and key2 = :param2
 update [TABLE] set [value] = '2015-04-26 21:59:24' where key1 = :param1 and key2 = :param2
因为值:UserName、User=:UserName和2015-04-26 21:59:24在单引号之间

我试图修改正则表达式,但似乎没有任何效果。我该怎么办

/'.*?'|(:[^\b]+?\b)/g
你的成绩将在第1组(帕伦匹配)

编辑:根据下面讨论的古怪:
/“.*?”|(:\B+?\B)/g

有关如何使用正则表达式进行匹配(因此也可以从匹配中排除)的示例,请参见引用了带转义序列的文本。@BadZen,我尝试了一些表达式的方法,但都不起作用……我对正则表达式不太精通,所以,我知道我犯了一些错误,但我不知道在哪里……谢谢。那就是说,你为什么自己解析原始SQL?通常这是一种“代码味道”“还有更好的方法……您好@BadZen,谢谢您的评论。我试图在Java上使用您的表达式(使用Java Pattern.compile),但它作为异常出现:Java.util.regex.PatternSyntaxException:索引11'.*?'附近的非法/不受支持的转义序列(:[^\b]+?\b)。我是否可以使用其他方法?您还问我为什么要自己解析查询。这是由于Android平台的一些限制,不允许我使用“命名参数”和其他问题。因此,适合我们项目e的唯一可行的解决方案是创建一个“层”,该层将根据我们的需要处理命名参数。这将非常困难,特别是在第二个查询中的
'User=:UserName'
示例中。我建议对命名参数使用不同的语法,这种语法不如分号常见。比如说
[:namedparameter:
。我想我无法说服你使用索引参数,嗯?=)这东西是def。总有一天会崩溃的。是的,真的很奇怪!顺便说一下,使用
“/”.*?”|(:[^\B]+?\B)/g
(转义的java字符串是
“.*?”|(:[^\\B]+?\B)”
就像一个符咒一样!!