регулярное выражение для замены пробелов подчеркиванием между двумя указанными строками - PullRequest
0 голосов
/ 25 января 2020

Мне нужно регулярное выражение для замены пробелов подчеркиванием в некоторых указанных c json значениях ключей.

Я использую gulp-replace, чтобы сделать бит замены. Это мой вайп:

const method1 = /(?<=title": ")(\s+)(?=",)/g; // not working 
const method2 = /(?:\G(?!^)|title": ")[^" ]*\K[ ]/g; // works in regex101.com but not when run as part of the gulp replace task below

gulp.task('spaceReplace', function () {
      return gulp
        .src(['src/data/data.json'])
        .pipe(replace(method2, '_'))
       .pipe(gulp.dest('src/data/output/'));
  });

Ввод (json файл данных):

{
 "stories": {
    "story1_category": "",
    "story1_title": "Blue Monday",
    "story1_link": "",
    "story2_category": "",
    "story2_title": "The Meaning Of Life",
    "story2_link": "",
    "story3_category": "",
    "story3_title": "Blind Mans Bluff",
    "story3_link": "",
    "story4_category": "",
    "story4_title": "The Art Of Fly-Fishing",
    "story4_link": "",
    "story5_category": "",
    "story5_title": "King Of The Hill"
    }
}

Желаемый вывод:

{
 "stories": {
    "story1_category": "",
    "story1_title": "Blue_Monday",
    "story1_link": "",
    "story2_category": "",
    "story2_title": "The_Meaning_Of_Life",
    "story2_link": "",
    "story3_category": "",
    "story3_title": "Blind_Mans_Bluff",
    "story3_link": "",
    "story4_category": "",
    "story4_title": "The_Art_Of_Fly-Fishing",
    "story4_link": "",
    "story5_category": "",
    "story5_title": "King_Of_The_Hill"
    }
}

Я попытался с помощью выражения найти соответствие для каждого узла и выбрать целое значение, которое работает:

(?<=title": ")(.*?)(?=",)

Затем я попробую следующее обновление - идея состоит в том, что я заменяю часть на 'match all с выражением, которое ищет совпадения только с пробелами в этом значении:

(?<=title": ")(\s+)(?=",)

Но это не работает. Почему вышеописанное не работает?

Я также попробовал другой метод, основанный на this

(?:\G(?!^)|title": ")[^" ]*\K[ ]

Это соответствует желаемым параметрам при тестировании с https://regex101.com/, но не совпадает при тестировании в https://regexr.com/ и также не работает, когда я пытаюсь использовать его в качестве моего method1 регулярного выражения в моей задаче gulp

Почему вышеописанное также не работает? И что такое решение, которое будет работать, чтобы соответствовать пробелам в каждом значении заголовка в дереве json?

Ответы [ 2 ]

2 голосов
/ 25 января 2020

Применение регулярного выражения к JavaScript объекту никогда не сработает, а применение его к JSON (строке) может работать, но приведет к нежелательному результату, если строка сложная. Вы хотите разбить его на мелкие кусочки и заменять только те части, которые необходимо заменить. Итак, вы хотите перебрать ключи и значения и изменить их:

const JSON = {
  "stories": {
    "story1 category": "",
    "story1 title": "Blue Monday",
    "story1 link": "",
    "story2 category": "",
    "story2 title": "The Meaning Of Life",
    "story2 link": "",
    "story3 category": "",
    "story3 title": "Blind Mans Bluff",
    "story3 link": "",
    "story4 category": "",
    "story4 title": "The Art Of Fly-Fishing",
    "story4 link": "",
    "story5 category": "",
    "story5 title": "King Of The Hill"
  }
}

//use Object.keys to loop over every key
Object.keys(JSON.stories).forEach( (item) => {
  //first update the item's value
  JSON.stories[item] = JSON.stories[item].replace(/\s+/g, "_");  
  
  //add a new property to stories containing the changed item key
  const replacedKey = item.replace(/\s+/g, "_");
  //set the item's value to the new key
  JSON.stories[replacedKey] = JSON.stories[item];
  //delete the old key
  delete JSON.stories[item];
});

console.log(JSON);
1 голос
/ 25 января 2020

Применение решения @ Mouser в моей задаче - я думаю, что это что-то вроде следующего, но и на этом тоже не получилось. Любой вклад высоко ценится:

var storiesData = require('./src/data/stories.json'); 

gulp.task('spaceReplace', function () {
    return Object.keys(storiesData).forEach( (item) => {
        return gulp
            .src(storiesData[item])
            .pipe(replace(/\s+/g, '_'))
            .pipe(gulp.dest('src/data/'));
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...