1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * See LICENSE.txt included in this distribution for the specific 9 * language governing permissions and limitations under the License. 10 * 11 * When distributing Covered Code, include this CDDL HEADER in each 12 * file and include the License file at LICENSE.txt. 13 * If applicable, add the following below this CDDL HEADER, with the 14 * fields enclosed by brackets "[]" replaced with your own identifying 15 * information: Portions Copyright [yyyy] [name of copyright owner] 16 * 17 * CDDL HEADER END 18 */ 19 20 /* 21 * Copyright (c) 2017, Chris Fraire <cfraire@me.com>. 22 */ 23 package org.opengrok.indexer.analysis.sql; 24 25 import java.util.regex.Pattern; 26 27 /** 28 * Represents a container for [PL]SQL-related utility methods. 29 */ 30 public class SQLUtils { 31 32 /** 33 * Matches an apostrophe that is not¹ part of a SQL apostrophe escape 34 * sequence: 35 * <pre> 36 * {@code 37 * \'((?<=^.(?!\'))|(?<=[^\'].(?!\'))|(?<=^(\'\'){1,3}.(?!\'))|(?<=[^\'](\'\'){1,3}.(?!\'))) 38 * } 39 * </pre> 40 * (Edit above and paste below [in NetBeans] for easy String escaping.) 41 * <p> 42 * ¹Correctness in a long sequence of apostrophes is limited because Java 43 * look-behind is not variable length but instead must have a definite 44 * upper bound in the regex definition. 45 */ 46 public static final Pattern STRINGLITERAL_APOS_DELIMITER = 47 Pattern.compile("\\'((?<=^.(?!\\'))|(?<=[^\\'].(?!\\'))|(?<=^(\\'\\'){1,3}.(?!\\'))|(?<=[^\\'](\\'\\'){1,3}.(?!\\')))"); 48 49 /* private to enforce static */ SQLUtils()50 private SQLUtils() { 51 } 52 } 53