【发布时间】:2011-02-12 22:35:01
【问题描述】:
我正在处理一些 SQL where 子句解析并设计了一个工作正则表达式,以使用使用 .NET API 的“Rad Software Regular Expression Desginer”来查找字符串文字之外的列。为了确保设计的 RegEx 也适用于 Java,我当然使用 API(1.5 和 1.6)对其进行了测试。但你猜怎么着,这行不通。我收到了消息
“后视组在索引 28 附近没有明显的最大长度”。
我试图解析的字符串是
Column_1='test''the''stuff''all''day''long' AND Column_2='000' AND TheVeryColumnIWantToFind = 'Column_1=''test''''the''''stuff''''all''''day''''long'' AND Column_2=''000'' AND TheVeryColumnIWantToFind = '' TheVeryColumnIWantToFind = '' AND (Column_3 is null or Column_3 = ''Not interesting'') AND ''1'' = ''1''' AND (Column_3 is null or Column_3 = 'Still not interesting') AND '1' = '1'
正如您可能已经猜到的那样,我试图创建某种最坏的情况以确保 RegEx 在更复杂的 SQL where 子句上不会失败。
RegEx 本身看起来像这样
(?i:(?<!=\s*'(?:[^']|(?:''))*)((?<=\s*)TheVeryColumnIWantToFind(?=(?:\s+|=))))
我不确定是否有更优雅的 RegEx(很可能会有一个),但现在这并不重要,因为它可以解决问题。
用几句话来解释 RegEx: 如果它找到了我要查找的列,它会进行否定的向后查找,以确定列名是否在字符串文字中使用。如果是这样,它将不匹配。如果没有,它会匹配。
回到问题。正如我之前提到的,它不适用于 Java。什么会起作用并产生我想要的结果?
我发现,Java 似乎不支持无限后视,但我仍然无法让它工作。
从搜索偏移量到当前搜索位置,后视总是对自身施加限制,这不是正确的吗?所以它会导致类似“位置 - 偏移”的东西?
【问题讨论】:
-
这很像问如何用正则表达式解析 HTML... 你需要这个做什么?验证 SQL?
-
我想将它用于 String.replaceAll(String, String) 以用“Alias.ColumnName”替换这些列,因为它们很简单。当然,我宁愿更正传入的字符串以消除需要此“修复”的根本原因,但不幸的是我无法触及。
标签: java regex negative-lookbehind