У меня возникла проблема: я пытаюсь выбрать значения всех параметров заголовка, год которых больше 19999. Я пробовал много способов. Но это работает неправильно, показывает весь год.
Ниже это мое регулярное выражение. Но это не работает
"Title":"([^"]+?)".*?"Year":20[0-9]{2}
Мои данные JSON ниже
{
"Data": {
"Items": [
{
"Start": "2018-04-05T05:00:00Z",
"End": "2018-04-05T05:30:00Z",
"Title": "Indiana Jones and the Raiders of the Lost Ark",
"Staff": {
"Director": "Steven Spielberg",
"Starring": "Harrison Ford"
},
"TimeZone": "UTC",
"Id": "6ec29f07-c845-4967-9c87-716825265312",
"Year": 1981,
"IsNew": false,
"ReadOnly": true
},
{
"Start": "2018-06-29T12:00:00Z",
"End": "2018-06-29T12:30:00Z",
"Title": "The Lion King",
"Staff": {
"Director": "Roger Allers",
"Starring": "James Earl Jones"
},
"TimeZone": "UTC",
"Id": "9d54f04d-3554-4b61-8077-0cfb79cb86db",
"Year": 1994,
"IsNew": false,
"ReadOnly": true
},
{
"Start": "2018-06-01T08:00:00Z",
"End": "2018-06-01T08:30:00Z",
"Title": "Titanic ",
"Staff": {
"Director": "James Cameron",
"Starring": "Leonardo DiCaprio"
},
"TimeZone": "UTC",
"Id": "aa174cd4-da58-4bf9-a7a7-7ae562b584e6",
"Year": 1997,
"IsNew": false,
"ReadOnly": true
},
{
"Start": "2018-04-27T07:00:00Z",
"End": "2018-04-27T07:30:00Z",
"Title": "Ready Player One",
"Staff": {
"Director": "Steven Spielberg",
"Starring": "Tye Sheridan"
},
"TimeZone": "UTC",
"Id": "425b2969-8ec0-4943-93ce-c5a1aec148b0",
"Year": 2018,
"IsNew": true,
"ReadOnly": false
}
],
"From": 0,
"Portion": 0,
"TotalCount": 0
},
"RedirectViewModel": null,
"ExceptionViewModel": null
}
Каков ваш ожидаемый ответ? @Md.ИсмиэльХоссенАбир
Почему бы вам не использовать парсер JSON?
Вы действительно имели в виду год «19999» в первом абзаце?
Привет @AdrianHHH, спасибо за ваш комментарий, это была ошибка при наборе. это будет 1999 год
Привет @Thefourthbird, в этом проекте мне нужно использовать только регулярное выражение. Спасибо
Привет @ArtBindu, мой ожидаемый ответ возвращает параметр заголовка года, который больше 1999. Спасибо.
Это может привести к ошибкам regex101.com/r/q7Bu4p/1
Привет @Thefourthbird, да, твое решение показывает ошибку
Я не знаю, что это значит. Какой язык вы используете? В чем ошибка? Каковы ожидаемые данные?
«В этом проекте мне нужно использовать только регулярное выражение»: по какой причине?
Решено с помощью кода JavaScript:
const js = {
"Data": {
"Items": [
{
"Start": "2018-04-05T05:00:00Z",
"End": "2018-04-05T05:30:00Z",
"Title": "Indiana Jones and the Raiders of the Lost Ark",
"Staff": {
"Director": "Steven Spielberg",
"Starring": "Harrison Ford"
},
"TimeZone": "UTC",
"Id": "6ec29f07-c845-4967-9c87-716825265312",
"Year": 1981,
"IsNew": false,
"ReadOnly": true
},
{
"Start": "2018-06-29T12:00:00Z",
"End": "2018-06-29T12:30:00Z",
"Title": "The Lion King",
"Staff": {
"Director": "Roger Allers",
"Starring": "James Earl Jones"
},
"TimeZone": "UTC",
"Id": "9d54f04d-3554-4b61-8077-0cfb79cb86db",
"Year": 1994,
"IsNew": false,
"ReadOnly": true
},
{
"Start": "2018-06-01T08:00:00Z",
"End": "2018-06-01T08:30:00Z",
"Title": "Titanic ",
"Staff": {
"Director": "James Cameron",
"Starring": "Leonardo DiCaprio"
},
"TimeZone": "UTC",
"Id": "aa174cd4-da58-4bf9-a7a7-7ae562b584e6",
"Year": 1997,
"IsNew": false,
"ReadOnly": true
},
{
"Start": "2018-04-27T07:00:00Z",
"End": "2018-04-27T07:30:00Z",
"Title": "Ready Player One",
"Staff": {
"Director": "Steven Spielberg",
"Starring": "Tye Sheridan"
},
"TimeZone": "UTC",
"Id": "425b2969-8ec0-4943-93ce-c5a1aec148b0",
"Year": 2018,
"IsNew": true,
"ReadOnly": false
}
],
"From": 0,
"Portion": 0,
"TotalCount": 0
},
"RedirectViewModel": null,
"ExceptionViewModel": null
};
// Select Titles after the Year
const fileterData = js.Data.Items.filter(x => x.Year > 1999);
console.info(fileterData.map(x => x.Title));
// alternative: js.Data.Items.filter(x => x.Year > 1999).map(x => x.Title)
Необходимый отказ от ответственности: задачи такого рода лучше всего выполнять с помощью подходящего парсера JSON.
Некоторые проблемы в вашем текущем регулярном выражении:
Для этого необходимо, чтобы после двоеточия не было пробела, разделяющего ключ и значение.
Он не ограничивает поиск приемлемого года буквальным объектом, в котором было найдено название.
Это позволяет году иметь более 4 цифр.
Если мы предположим, что структура JSON такая, как показано, включая порядок ключей и расположение вложенных объектов, мы могли бы сначала пропустить литерал вложенного объекта, то есть пару ключ/значение Staff
, а затем искать год, но не принимать больше закрывающих скобок.
Так:
"Title":\s*"([^"]+?)"[^}]*}[^}]*"Year":\s*20[0-9]{2}\b
Обратите внимание, что ваше регулярное выражение (а также это) не допускает пустых заголовков, т. е. ""
, и требует, чтобы вторая цифра в году была 0. Это не было явно упомянуто в вопросе, но я предполагаю, что это то, что вы намеревался.
Почему здесь нежадный квантификатор: ([^"]+?)
?
Это было в ОП. Я не менял, так как это не имеет значения.
Я думаю, вы хотите проверить текст на наличие опечаток.