私はいくつかの SQL where 句の解析を行っており、.NET API を使用している「Rad Software Regular Expression Desginer」を使用して、文字列リテラルの外側の列を見つけるために動作する RegEx を設計しました。設計された 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'
ご想像のとおり、より複雑な SQL where 句で RegEx が失敗しないように、ある種の最悪のケースを作成しようとしました。
正規表現自体は次のようになります
(?i:(?<!=\s*'(?:[^']|(?:''))*)((?<=\s*)TheVeryColumnIWantToFind(?=(?:\s+|=))))
もっと洗練された RegEx があるかどうかはわかりませんが (おそらく存在するでしょう)、それはトリックを実行するので、現時点では重要ではありません。
RegEx を簡単に説明すると、探している列が見つかった場合、列名が文字列リテラルで使用されているかどうかを判断するために、否定的な後読みが行われます。もしそうなら、それは一致しません。そうでない場合は一致します。
質問に戻ります。前述したように、Java では動作しません。何が機能し、私が望む結果になりますか?
私は、Java が無制限の後読みをサポートしていないように見えることを知りましたが、それでも動作させることができませんでした。
後読みが常に検索オフセットから現在の検索位置までに制限をかけているのは正しくありませんか? それで、「位置 - オフセット」のような結果になりますか?