многострочная строка findIndex () - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь найти многострочную подстроку в моей строке.

Мой код:

data = `if (res) {
                                new PNotify({
                                    title: TAPi18n.__('success'),
                                    text: TAPi18n.__('image_uploaded'),
                                    type: 'info',
                                    styling: 'bootstrap3'
                                });
                            }
                            if (err) {
                                return new PNotify({
                                    title: TAPi18n.__('error'),
                                    text: err,
                                    type: 'error',
                                    styling: 'bootstrap3'
                                });
                            }`;

/*not found...*/
match = `new PNotify({
              title: TAPi18n.__('error'),
              text: err,
              type: 'error',
              styling: 'bootstrap3'
            })`;
console.log(data);
console.log(match);
console.log(data.indexOf(match));

Эта строка console.log(data.indexOf(match)); показывает мне -1. Что не так с моим кодом? Как я могу сделать этот многострочный поиск?

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Вам необходимо нормализовать ваших строк перед их сравнением

Вот простая функция, которая разбивает вашу строку по строкам и удаляет пробелы для каждой строки, прежде чем объединять все вместе

function normalizeString(str){
  return str.split('\n').map(e => e.trim()).join('')
}

Выход:

data = `if (res) {
                                new PNotify({
                                    title: TAPi18n.__('success'),
                                    text: TAPi18n.__('image_uploaded'),
                                    type: 'info',
                                    styling: 'bootstrap3'
                                });
                            }
                            if (err) {
                                return new PNotify({
                                    title: TAPi18n.__('error'),
                                    text: err,
                                    type: 'error',
                                    styling: 'bootstrap3'
                                });
                            }`;

/*not found...*/
match = `new PNotify({
              title: TAPi18n.__('error'),
              text: err,
              type: 'error',
              styling: 'bootstrap3'
            })`;

// normalize strings
var normalizedData = data.split('\n').map(e => e.trim()).join('')
var normalizedMatch = match.split('\n').map(e => e.trim()).join('')

console.log(normalizedData)
console.log(normalizedMatch)
console.log(normalizedData.indexOf(normalizedMatch));
0 голосов
/ 17 марта 2020

Проблема в том, что количество пробелов не совпадает между match и data.

. Вы можете преобразовать match в регулярное выражение, которое допускает переменное количество пробелов.

Первый match.replace() используется для экранирования всех специальных символов регулярного выражения в строке, второй преобразует пробел в \s+, поэтому он будет соответствовать любому количеству.

data = `if (res) {
                                new PNotify({
                                    title: TAPi18n.__('success'),
                                    text: TAPi18n.__('image_uploaded'),
                                    type: 'info',
                                    styling: 'bootstrap3'
                                });
                            }
                            if (err) {
                                return new PNotify({
                                    title: TAPi18n.__('error'),
                                    text: err,
                                    type: 'error',
                                    styling: 'bootstrap3'
                                });
                            }`;


match = `new PNotify({
              title: TAPi18n.__('error'),
              text: err,
              type: 'error',
              styling: 'bootstrap3'
            })`;
re = new RegExp(match.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&').replace(/\s+/g, '\\s+'));

result = data.match(re);
console.log(result && result.index);
...