jayway JsonPath + рубиновое регулярное выражение

я почти новичок в регулярных выражениях.

Я пишу выражение JsonPath, используя jayway и ruby regexp Я хочу найти узел, сопоставив только первые 2 буквы свойства автора книги

Фактическое выражение

$..book[?(@.author =~ /\A.{0}(Ni).*/)]

находит то, что мне нужно

[
   {
      "category" : "reference",
      "author" : "Nigel Rees",
      "title" : "Sayings of the Century",
      "price" : 8.95
   }
]

от

{
"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

}

Знаете ли вы более чистое регулярное выражение для этого случая? Что не нужно или что следует добавить в фактическое регулярное выражение?


person Denys Lonshakov    schedule 13.08.2015    source источник


Ответы (1)


Позвольте мне попробовать.

Регулярное выражение /\A.{0}(Ni).*/ означает:

  1. \A — соответствует началу строки
  2. .{0} — соответствует любому символу, кроме новой строки, ровно 0 раз
  3. (Ni) — Сопоставление и захват в буквальный текст группы 1 Ni
  4. .* - Сопоставьте 0 или более символов, отличных от новой строки, как можно большему количеству

И вы просто проверяете совпадение с =~.

Ненужными частями являются точки 1 и 2. Удалите \A, так как выражение по умолчанию привязано. Удалите .{0}, так как это не имеет смысла.

.* кажется необходимым, так как выражение должно соответствовать всей строке. И в качестве небольшого улучшения удалите скобки из (Ni), так как вы не используете никаких обратных ссылок. Обратите внимание, что с логической точки зрения бессмысленно захватывать/сохранять что-то, что мы уже знаем, с помощью регулярного выражения, если для этого нет какой-то конкретной цели (например, разбиение строки на массив).

Таким образом, используйте

$..book[?(@.author =~ /Ni.*/)]

Обратите внимание, что добавление модификатора /i приводит к тому, что выражение также соответствует значениям, начинающимся с ni.

person Wiktor Stribiżew    schedule 13.08.2015
comment
Спасибо, но нет, '$..book[?(@.author =~ /\ANi/)]' ничего не находит, вы можете проверить выражение [здесь](jsonpath.herokuapp.com/?path=$..book[? %[email protected]%20=~%20.*REES/i%29]) - person Denys Lonshakov; 14.08.2015