Skip to content

Commit f9ce652

Browse files
committed
Fix parsing of lookahead expressions.
Signed-off-by: Igor Peshansky <ipeshansky@nvidia.com>
1 parent cbae742 commit f9ce652

1 file changed

Lines changed: 10 additions & 17 deletions

File tree

sql-plugin/src/main/scala/com/nvidia/spark/rapids/RegexParser.scala

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -178,24 +178,17 @@ class RegexParser(pattern: String) {
178178
}
179179

180180
private def parseGroup(): RegexAST = {
181-
var captureGroup = if (pos + 1 < pattern.length
181+
val (captureGroup, lookahead) = if (pos + 1 < pattern.length
182182
&& pattern.charAt(pos) == '?'
183-
&& pattern.charAt(pos+1) == ':') {
184-
pos += 2
185-
false
186-
} else {
187-
true
188-
}
189-
val lookahead = if (pos + 1 < pattern.length
190-
&& "!=".contains(pattern.charAt(pos))) {
191-
pos += 1
192-
captureGroup = false
193-
pattern.charAt(pos-1) match {
194-
case '=' => Some(RegexPositiveLookahead)
183+
&& ":!=".contains(pattern.charAt(pos+1))) {
184+
consumeExpected('?')
185+
(false, consume() match { // exhaustiveness guaranteed by the guard
186+
case ':' => None
195187
case '!' => Some(RegexNegativeLookahead)
196-
}
188+
case '=' => Some(RegexPositiveLookahead)
189+
})
197190
} else {
198-
None
191+
(true, None)
199192
}
200193
val term = parseUntil(() => peek().contains(')'))
201194
consumeExpected(')')
@@ -1762,8 +1755,8 @@ sealed case class RegexGroup(capture: Boolean, term: RegexAST,
17621755
s"(${term.toRegexString})"
17631756
} else if (lookahead.isDefined) {
17641757
lookahead match {
1765-
case Some(RegexPositiveLookahead) => s"(=${term.toRegexString})"
1766-
case Some(RegexNegativeLookahead) => s"(!${term.toRegexString})"
1758+
case Some(RegexPositiveLookahead) => s"(?=${term.toRegexString})"
1759+
case Some(RegexNegativeLookahead) => s"(?!${term.toRegexString})"
17671760
case _ => throw new IllegalStateException("Should not reach here")
17681761
}
17691762
} else {

0 commit comments

Comments
 (0)