Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

com.google.re2j.PatternSyntaxException: error parsing regexp #156

Closed
mountainowl opened this issue Mar 22, 2018 · 9 comments
Closed

com.google.re2j.PatternSyntaxException: error parsing regexp #156

mountainowl opened this issue Mar 22, 2018 · 9 comments

Comments

@mountainowl
Copy link

mountainowl commented Mar 22, 2018

Issue

Just updated to 1.8.0 and ran into this issue.
re2j does not support lookahead.
this was working around version 1.4.1

Schema

"secret": {
"type": "string",
"description": "password",
"maxLength": 512,
"pattern": "^(?=.*[\p{L}\p{N}\p{Mn}\p{Pd}\p{S}\p{P}\d])[\p{L}\p{N}\p{Mn}\p{Pd}\p{S}\p{P}\d]{8,}"
},

Stack trace

com.google.re2j.PatternSyntaxException: error parsing regexp: invalid or unsupported Perl syntax: `(?=`
	at com.google.re2j.Parser.parsePerlFlags(Parser.java:1139)
	at com.google.re2j.Parser.parseInternal(Parser.java:825)
	at com.google.re2j.Parser.parse(Parser.java:802)
	at com.google.re2j.RE2.compileImpl(RE2.java:183)
	at com.google.re2j.Pattern.compile(Pattern.java:136)
	at com.google.re2j.Pattern.compile(Pattern.java:96)
	at org.everit.json.schema.StringSchema.<init>(StringSchema.java:103)
	at org.everit.json.schema.StringSchema$Builder.build(StringSchema.java:34)
	at org.everit.json.schema.StringSchema$Builder.build(StringSchema.java:20)
	at org.everit.json.schema.loader.ReferenceLookup.lookup(ReferenceLookup.java:164)
	at org.everit.json.schema.loader.SchemaLoader.buildSchemaWithoutExplicitType(SchemaLoader.java:334)
	at org.everit.json.schema.loader.SchemaLoader.lambda$loadSchemaObject$4(SchemaLoader.java:380)
	at java.util.Optional.orElseGet(Optional.java:267)
	at org.everit.json.schema.loader.SchemaLoader.loadSchemaObject(SchemaLoader.java:378)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:44)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:421)
	at org.everit.json.schema.loader.SchemaLoader.loadChild(SchemaLoader.java:464)
	at org.everit.json.schema.loader.ObjectSchemaLoader.addPropertySchemaDefinition(ObjectSchemaLoader.java:68)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$populatePropertySchemas$9(ObjectSchemaLoader.java:62)
	at org.everit.json.schema.loader.JsonObject.iterateOnEntry(JsonObject.java:85)
	at org.everit.json.schema.loader.JsonObject.lambda$forEach$1(JsonObject.java:80)
	at java.util.HashMap$EntrySet.forEach(HashMap.java:1043)
	at org.everit.json.schema.loader.JsonObject.forEach(JsonObject.java:80)
	at org.everit.json.schema.loader.ObjectSchemaLoader.populatePropertySchemas(ObjectSchemaLoader.java:59)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$load$0(ObjectSchemaLoader.java:31)
	at java.util.Optional.ifPresent(Optional.java:159)
	at org.everit.json.schema.loader.ObjectSchemaLoader.load(ObjectSchemaLoader.java:31)
	at org.everit.json.schema.loader.SchemaLoader.buildObjectSchema(SchemaLoader.java:446)
	at org.everit.json.schema.loader.SchemaLoader.loadForExplicitType(SchemaLoader.java:439)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:44)
	at org.everit.json.schema.loader.SchemaLoader.loadForType(SchemaLoader.java:456)
	at org.everit.json.schema.loader.SchemaLoader.lambda$loadSchemaObject$4(SchemaLoader.java:382)
	at java.util.Optional.orElseGet(Optional.java:267)
	at org.everit.json.schema.loader.SchemaLoader.loadSchemaObject(SchemaLoader.java:378)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:44)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:421)
	at org.everit.json.schema.loader.SchemaLoader.loadChild(SchemaLoader.java:464)
	at org.everit.json.schema.loader.ObjectSchemaLoader.addPropertySchemaDefinition(ObjectSchemaLoader.java:68)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$populatePropertySchemas$9(ObjectSchemaLoader.java:62)
	at org.everit.json.schema.loader.JsonObject.iterateOnEntry(JsonObject.java:85)
	at org.everit.json.schema.loader.JsonObject.lambda$forEach$1(JsonObject.java:80)
	at java.util.HashMap$EntrySet.forEach(HashMap.java:1043)
	at org.everit.json.schema.loader.JsonObject.forEach(JsonObject.java:80)
	at org.everit.json.schema.loader.ObjectSchemaLoader.populatePropertySchemas(ObjectSchemaLoader.java:59)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$load$0(ObjectSchemaLoader.java:31)
	at java.util.Optional.ifPresent(Optional.java:159)
	at org.everit.json.schema.loader.ObjectSchemaLoader.load(ObjectSchemaLoader.java:31)
	at org.everit.json.schema.loader.SchemaLoader.buildObjectSchema(SchemaLoader.java:446)
	at org.everit.json.schema.loader.SchemaLoader.loadForExplicitType(SchemaLoader.java:439)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:44)
	at org.everit.json.schema.loader.SchemaLoader.loadForType(SchemaLoader.java:456)
	at org.everit.json.schema.loader.SchemaLoader.lambda$loadSchemaObject$4(SchemaLoader.java:382)
	at java.util.Optional.orElseGet(Optional.java:267)
	at org.everit.json.schema.loader.SchemaLoader.loadSchemaObject(SchemaLoader.java:378)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:44)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:421)
@erosb
Copy link
Contributor

erosb commented Mar 24, 2018

Hello, I tried to create a testcase for your problem, but even the JSON parsing fails:

org.json.JSONException: Illegal escape. at 127 [character 24 line 7]

@mountainowl
Copy link
Author

mountainowl commented Mar 27, 2018 via email

@Gabology
Copy link

Gabology commented May 7, 2018

Can also confirm that I'm having the same issue. The reason seems to be that RE2 does not support lookaheads. However this does raise some issues since the JSON schema spec states that the regex syntax used is ECMA-262 which supports lookaheads. So I'm guessing another regex engine would have to be used to resolve this.

@ihar-knyshau
Copy link

Change version from 1.8.0 to 1.7.0. It should works fine.

@erosb
Copy link
Contributor

erosb commented Jun 5, 2018

There will be a new release this week fixing this problem (and also some others), so probably better to wait a bit instead of downgrading.

@erosb
Copy link
Contributor

erosb commented Jun 7, 2018

The fix is available in the latest release: 1.9.0

@erosb erosb closed this as completed Jun 7, 2018
@octavianN
Copy link

octavianN commented Jun 8, 2018

In the documentation it says:

if you don't need the RE2J implementation, it is recommended to exclude it in your pom.xml
https://github.com/everit-org/json-schema#regexp-implementations

But if I exclude "re2j" from the pom.xml, and I try to load the schema using SchemaLoader.load(schemaJson), I get the an exception.

{
    "$schema": "http://json-schema.org/draft-06/schema#",
    "type": "object",
    "properties": {
        "attributes": {
            "type": "object",
            "patternProperties": {
                "^(?!relationships$|links$|id$|type$)\\w[-\\w_]*$": {}
            }
        }
    }
}
java.lang.NoClassDefFoundError: com/google/re2j/Pattern
	at org.everit.json.schema.ObjectSchema$Builder.patternProperty(ObjectSchema.java:93)
	at org.everit.json.schema.ObjectSchema$Builder.patternProperty(ObjectSchema.java:98)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$null$6(ObjectSchemaLoader.java:43)
	at java.util.HashMap$KeySet.forEach(HashMap.java:933)
	at java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$load$7(ObjectSchemaLoader.java:41)
	at java.util.Optional.ifPresent(Optional.java:159)
	at org.everit.json.schema.loader.ObjectSchemaLoader.load(ObjectSchemaLoader.java:40)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.buildObjectSchema(SchemaExtractor.java:113)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.loadForExplicitType(SchemaExtractor.java:260)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:44)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.extract(SchemaExtractor.java:229)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.extract(SchemaExtractor.java:80)
	at org.everit.json.schema.loader.SchemaLoader.runSchemaExtractors(SchemaLoader.java:355)
	at org.everit.json.schema.loader.SchemaLoader.loadSchemaObject(SchemaLoader.java:323)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:44)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:393)
	at org.everit.json.schema.loader.SchemaLoader.loadChild(SchemaLoader.java:397)
	at org.everit.json.schema.loader.ObjectSchemaLoader.addPropertySchemaDefinition(ObjectSchemaLoader.java:68)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$populatePropertySchemas$9(ObjectSchemaLoader.java:62)
	at org.everit.json.schema.loader.JsonObject.iterateOnEntry(JsonObject.java:84)
	at org.everit.json.schema.loader.JsonObject.lambda$forEach$1(JsonObject.java:79)
	at java.util.HashMap$EntrySet.forEach(HashMap.java:1044)
	at org.everit.json.schema.loader.JsonObject.forEach(JsonObject.java:79)
	at org.everit.json.schema.loader.ObjectSchemaLoader.populatePropertySchemas(ObjectSchemaLoader.java:59)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$load$0(ObjectSchemaLoader.java:31)
	at java.util.Optional.ifPresent(Optional.java:159)
	at org.everit.json.schema.loader.ObjectSchemaLoader.load(ObjectSchemaLoader.java:31)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.buildObjectSchema(SchemaExtractor.java:113)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.loadForExplicitType(SchemaExtractor.java:260)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:44)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.extract(SchemaExtractor.java:229)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.extract(SchemaExtractor.java:80)
	at org.everit.json.schema.loader.SchemaLoader.runSchemaExtractors(SchemaLoader.java:355)
	at org.everit.json.schema.loader.SchemaLoader.loadSchemaObject(SchemaLoader.java:323)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:44)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:393)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:257)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:240)

@octavianN
Copy link

I tested with the latest 1.9.0 build.
Also, if I leave the "re2j" dependency in the pom.xml and I load the same schema I get another error:

com.google.re2j.PatternSyntaxException: error parsing regexp: invalid or unsupported Perl syntax: `(?!`
	at com.google.re2j.Parser.parsePerlFlags(Parser.java:1139)
	at com.google.re2j.Parser.parseInternal(Parser.java:825)
	at com.google.re2j.Parser.parse(Parser.java:802)
	at com.google.re2j.RE2.compileImpl(RE2.java:183)
	at com.google.re2j.Pattern.compile(Pattern.java:136)
	at com.google.re2j.Pattern.compile(Pattern.java:96)
	at org.everit.json.schema.ObjectSchema$Builder.patternProperty(ObjectSchema.java:93)
	at org.everit.json.schema.ObjectSchema$Builder.patternProperty(ObjectSchema.java:98)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$null$6(ObjectSchemaLoader.java:43)
	at java.util.HashMap$KeySet.forEach(HashMap.java:933)
	at java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$load$7(ObjectSchemaLoader.java:41)
	at java.util.Optional.ifPresent(Optional.java:159)
	at org.everit.json.schema.loader.ObjectSchemaLoader.load(ObjectSchemaLoader.java:40)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.buildObjectSchema(SchemaExtractor.java:113)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.loadForExplicitType(SchemaExtractor.java:260)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:44)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.extract(SchemaExtractor.java:229)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.extract(SchemaExtractor.java:80)
	at org.everit.json.schema.loader.SchemaLoader.runSchemaExtractors(SchemaLoader.java:355)
	at org.everit.json.schema.loader.SchemaLoader.loadSchemaObject(SchemaLoader.java:323)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:44)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:393)
	at org.everit.json.schema.loader.SchemaLoader.loadChild(SchemaLoader.java:397)
	at org.everit.json.schema.loader.ObjectSchemaLoader.addPropertySchemaDefinition(ObjectSchemaLoader.java:68)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$populatePropertySchemas$9(ObjectSchemaLoader.java:62)
	at org.everit.json.schema.loader.JsonObject.iterateOnEntry(JsonObject.java:84)
	at org.everit.json.schema.loader.JsonObject.lambda$forEach$1(JsonObject.java:79)
	at java.util.HashMap$EntrySet.forEach(HashMap.java:1044)
	at org.everit.json.schema.loader.JsonObject.forEach(JsonObject.java:79)
	at org.everit.json.schema.loader.ObjectSchemaLoader.populatePropertySchemas(ObjectSchemaLoader.java:59)
	at org.everit.json.schema.loader.ObjectSchemaLoader.lambda$load$0(ObjectSchemaLoader.java:31)
	at java.util.Optional.ifPresent(Optional.java:159)
	at org.everit.json.schema.loader.ObjectSchemaLoader.load(ObjectSchemaLoader.java:31)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.buildObjectSchema(SchemaExtractor.java:113)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.loadForExplicitType(SchemaExtractor.java:260)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:44)
	at org.everit.json.schema.loader.TypeBasedSchemaExtractor.extract(SchemaExtractor.java:229)
	at org.everit.json.schema.loader.AbstractSchemaExtractor.extract(SchemaExtractor.java:80)
	at org.everit.json.schema.loader.SchemaLoader.runSchemaExtractors(SchemaLoader.java:355)
	at org.everit.json.schema.loader.SchemaLoader.loadSchemaObject(SchemaLoader.java:323)
	at org.everit.json.schema.loader.JsonValue$Multiplexer.requireAny(JsonValue.java:44)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:393)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:257)
	at org.everit.json.schema.loader.SchemaLoader.load(SchemaLoader.java:240)

@erosb
Copy link
Contributor

erosb commented Jun 19, 2018

Thanks for reporting it @octavianN . I forgot about "patternProperties" when working on this change.
We released version 1.9.1 fixing it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants