diff --git a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaLexer.java b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaLexer.java index 90609483ea37..43773372097f 100644 --- a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaLexer.java +++ b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaLexer.java @@ -1520,6 +1520,11 @@ private STToken readRegExpTemplateToken() { shouldProcessInterpolations = false; } while (!reader.isEOF()) { + if (shouldProcessInterpolations && this.reader.peek() == LexerTerminals.BACKSLASH + && this.reader.peek(1) == LexerTerminals.OPEN_BRACKET) { + // Escaped open brackets are not considered as the start of a no interpolation context. + reader.advance(); + } reader.advance(); nextChar = this.reader.peek(); switch (nextChar) { @@ -1536,6 +1541,11 @@ private STToken readRegExpTemplateToken() { case LexerTerminals.CLOSE_BRACKET: shouldProcessInterpolations = true; continue; + case LexerTerminals.BACKSLASH: + if (!shouldProcessInterpolations && this.reader.peek(1) == LexerTerminals.CLOSE_BRACKET) { + reader.advance(); + } + continue; default: continue; } diff --git a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/RegExpParser.java b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/RegExpParser.java index b3375f2b555d..ef48f6693fee 100644 --- a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/RegExpParser.java +++ b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/RegExpParser.java @@ -427,6 +427,9 @@ private STNode parseCharSetAtom(STToken nextToken, STNode prevNode) { return STNodeFactory.createToken(SyntaxKind.ESCAPED_MINUS_TOKEN, minusToken.leadingMinutiae(), minusToken.trailingMinutiae()); } + if (token.kind == SyntaxKind.CLOSE_BRACKET_TOKEN) { + this.tokenReader.startMode(ParserMode.RE_CHAR_CLASS); + } return parseReEscape(); default: STNode consumedToken = consume(); diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/types/regexp/regexp_value_test.bal b/tests/jballerina-unit-test/src/test/resources/test-src/types/regexp/regexp_value_test.bal index ca82e86a0425..5d7a922a3979 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/types/regexp/regexp_value_test.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/types/regexp/regexp_value_test.bal @@ -81,6 +81,15 @@ function testRegExpValueWithCharacterClass() { string:RegExp x7 = re `[\p{sc=Latin}\p{gc=Lu}\p{Lt}\tA\)]??`; assertEquality("[\\p{sc=Latin}\\p{gc=Lu}\\p{Lt}\\tA\\)]??", x7.toString()); + + string:RegExp x8 = re `abc[a-z\]A-Z${"abc"}]`; + assertEquality("abc[a-z\\]A-Z${\"abc\"}]", x8.toString()); + + string:RegExp x9 = re `abc\[a-z\]A-Z${"abc"}`; + assertEquality("abc\\[a-z\\]A-Zabc", x9.toString()); + + string:RegExp x10 = re `\[${"a"}\]`; + assertEquality("\\[a\\]", x10.toString()); } function testRegExpValueWithCharacterClass2() {