我正在使用一些 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(很可能会有一个),但这并不重要,因为它可以解决问题。
用几句话来解释正则表达式:如果它找到了我所追求的列,它会进行否定的向后查找,以确定列名是否在字符串文字中使用。如果是这样,它将不匹配。如果不是,它将匹配。
回到问题。正如我之前提到的,它不适用于 Java。什么会起作用并产生我想要的结果?
我发现,Java 似乎不支持无限后视,但我仍然无法让它工作。
从搜索偏移量到当前搜索位置,后视总是对自身施加限制,这不是正确的吗?所以它会导致像“位置 - 偏移”这样的东西?