json-schema : accept escaped hyphen in regex patterns (#29127)

This commit is contained in:
chiheb ben cheikh 2026-09-19 13:11:13 +01:00 • committed by GitHub
parent 5b59b83f4e
commit eb1e1f495f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 29 additions and 2 deletions

View file

@ -321,7 +321,8 @@ static size_t gbnf_escape_length(const std::string & pattern, size_t pos) {
case 'x': n_hex = 2; break;
case 'u': n_hex = 4; break;
case 'U': n_hex = 8; break;
case 't': case 'r': case 'n': case '\\': case '"': case '[': case ']':
// keep in sync with parse_char() in src/llama-grammar.cpp
case 't': case 'r': case 'n': case '\\': case '"': case '[': case ']': case '-':
return 2;
default:
return 0;

View file

@ -1476,6 +1476,32 @@ static void test_all(const std::string & title, std::function<void(const TestCas
)"""
});
test({
SUCCESS,
"regexp with escaped hyphen in a character class",
R"""({
"type": "string",
"pattern": "^[a-z\\-]+$"
})""",
R"""(
root ::= "\"" ([a-z\-]+) "\""
space ::= | " " | "\n"{1,2} [ \t]{0,20}
)"""
});
test({
SUCCESS,
"regexp with escaped hyphen outside a character class",
R"""({
"type": "string",
"pattern": "^a\\-b$"
})""",
R"""(
root ::= "\"" ("a\-b") "\""
space ::= | " " | "\n"{1,2} [ \t]{0,20}
)"""
});
// a regexp that is invalid under any flavor is still an error
test({
FAILURE,
@ -1494,7 +1520,7 @@ static void test_all(const std::string & title, std::function<void(const TestCas
R"""({
"type": "object",
"properties": {
"a": { "type": "string", "pattern": "^[a-z\\-]+$" }
"a": { "type": "string", "pattern": "^(?=a)a$" }
},
"required": ["a"],
"additionalProperties": false