16

We are using a tool which uses jayway library for evaluating JSONpath expression. Javascript does NOT seem to work with it. How can I use regular expression in the JSONPath in such a case. For instance, in the below example I would like to filter all book titles whose title has the word "Sword" in it:

{
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}
1
  • I would find a workaround instead of trying to use regular expression. Commented Mar 10, 2015 at 1:33

3 Answers 3

19

The Jayway implementation uses the Ruby regex operator:

$.store.book[?(@.title =~ /^.*Sword.*$/)]

To ignore case:

$.store.book[?(@.title =~ /^.*sword.*$/i)]
Sign up to request clarification or add additional context in comments.

3 Comments

I tried the above expression with json-path-0.9.0 in the classpath (as the tool uses the version 0.9 internally) and the statement Object result = JsonPath.read(jsonStr, query); where jsonStr is the one shared in the example above. The result is an empty set
Regex support was added in 1.2.0.
Nice. If I want to get values of all keys that startswith title, How would I go about writing it?
2

For the record, a workaround for conditional regex in Goessner's javascript JSONpath would be to write the query as follow:

$.store.book[?(/^.*sword.*$/i.test(@.title))]

Please see here https://github.com/jpaquit/jsonpath/tree/0.8.5-+-regexp for "=~" syntax in JS lib.

2 Comments

Any clues as to what i.test is? :D
@bviktor "i" is the regex flag for "case-insensitive" and "test" is the dedicated JS function ;) developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
0

You could use capturing group or lookbehind assertion.

"title":\s*"([^"]*\bSword\b[^"]*)"

Add case-insensitive modifier i if necessary. Grab the title string from group index 1.

DEMO

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.