diff options
Diffstat (limited to 'sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/StringUtils.scala')
-rw-r--r-- | sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/StringUtils.scala | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/StringUtils.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/StringUtils.scala index c03cc4c718..79c61023b4 100644 --- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/StringUtils.scala +++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/StringUtils.scala @@ -23,27 +23,27 @@ import org.apache.spark.unsafe.types.UTF8String object StringUtils { - // replace the _ with .{1} exactly match 1 time of any character - // replace the % with .*, match 0 or more times with any character + /** Convert 'like' pattern to Java regex. */ def escapeLikeRegex(str: String): String = { - val builder = new StringBuilder() - var escaping = false - for (next <- str) { - if (escaping) { - builder ++= Pattern.quote(Character.toString(next)) - escaping = false - } else if (next == '\\') { - escaping = true - } else { - builder ++= (next match { - case '_' => "." - case '%' => ".*" - case _ => Pattern.quote(Character.toString(next)) - }) - escaping = false + val in = str.toIterator + val out = new StringBuilder() + + while (in.hasNext) { + in.next match { + case '\\' if in.hasNext => + in.next match { + case '\\' => out ++= Pattern.quote("\\") + case '_' => out ++= Pattern.quote("_") + case '%' => out ++= Pattern.quote("%") + // escape before non-escapable character treated literally + case c => out ++= Pattern.quote("\\" + c) + } + case '_' => out ++= "." + case '%' => out ++= ".*" + case c => out ++= Pattern.quote(Character.toString(c)) } } - "(?s)" + builder.result() // (?s) enables dotall mode, causing "." to match new lines + "(?s)" + out.result() // (?s) enables dotall mode, causing "." to match new lines } private[this] val trueStrings = Set("t", "true", "y", "yes", "1").map(UTF8String.fromString) |