функция js — trim работает только с ведущими новыми строками и вкладками

#javascript

#javascript

Вопрос:

Я извлекаю некоторые данные из таблицы и добавляю в массив, функция обрезки работает только с ведущими n и t и все еще сохраняет ведущие новые строки и вкладки.

Я посмотрел на Stackoverflow и использовал некоторые функции замены без результата.

 const test = 'https://www.sec.gov/Archives/edgar/data/24741/000002474118000053/glw-20180930x10q.htm'

const request = require('request');

const cheerio = require('cheerio');

request(test, (error, res, html) => {
  if (!error amp;amp; res.statusCode == 200) {
    // console.log(html)

    const $ = cheerio.load(html)

    const table = $("tr:contains('Cash and cash equivalents')")

    const items = []

    items.push(table.text().trim())

    console.log(items)

  }
})
  

Мне нужно [cash and cash equivalents, 1903, ...] вместо этого я получаю:

[ 'Cash and cash equivalentsnttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt1,903 nttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt4,317 nttttntttnttttntttttnttttttCash and cash equivalents at beginning of periodnttttnttttntttttntttttt nttttnttttntttttntttttt nttttntttt4,317 nttttnttttntttttntttttt nttttnttttntttttntttttt nttttntttt5,291 nttttntttnttttntttttnttttttCash and cash equivalents at end of periodnttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt1,903 nttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt3,865' ]

Комментарии:

1. Почему вы ожидаете такого вывода? При копировании текста из таблицы вы получите текст с разделителями табуляции.

2. обрезка работает только с концами строк

Ответ №1:

Вы получаете ответ в виде одной строки на свой запрос

trim() применяется к строке и удаляет пустые символы только из ее начала и конца

для достижения желаемого вы можете использовать split() эту строку по regex /[n|t]/ ее значениям any tab or any newline , а затем отфильтровать этот массив из пустых строк и элементов обрезки

 let s = 'Cash and cash equivalentsnttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt1,903 nttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt4,317 nttttntttnttttntttttnttttttCash and cash equivalents at beginning of periodnttttnttttntttttntttttt nttttnttttntttttntttttt nttttntttt4,317 nttttnttttntttttntttttt nttttnttttntttttntttttt nttttntttt5,291 nttttntttnttttntttttnttttttCash and cash equivalents at end of periodnttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt1,903 nttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt3,865';

s = s.split(/[n|t]/)
     .filter(el => el.trim().length)
     .map(el => el.trim()); 

console.log(s)  

PS: извините за мой английский

Ответ №2:

trim() Функция удаляет пробелы только в начале и / или в конце строки. Чтобы удалить все вхождения n и t пробелов во всей строке, рассмотрите возможность использования replace() со следующим регулярным выражением:

 someString.replace(/[n|t]/gm, '')
  

Это в основном означает «сопоставлять каждый символ n или t в нескольких строках (m) глобально (g) по всей строке и заменять совпадения на «»

 const inputString = 'Cash and cash equivalentsnttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt1,903 nttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt4,317 nttttntttnttttntttttnttttttCash and cash equivalents at beginning of periodnttttnttttntttttntttttt nttttnttttntttttntttttt nttttntttt4,317 nttttnttttntttttntttttt nttttnttttntttttntttttt nttttntttt5,291 nttttntttnttttntttttnttttttCash and cash equivalents at end of periodnttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt1,903 nttttnttttntttttntttttt nttttnttttntttttntttttt$nttttntttt3,865'

const outputString = inputString.replace(/[n|t]/gm, '');

console.log(outputString);  

Чтобы интегрировать это в свой код, вы могли бы сделать следующее:

 items.push(table.text().replace(/[n|t]/gm, ''));
  

Комментарии:

1. Вместо чередования, не лучше ли использовать класс символов и, возможно, включать пробел? .replace(/[tn]/gm, '') или .replace(/[ tn]/gm, '') ?

2. @StephenP хороший момент — только что обновленный ответ. Спасибо за предложение! 🙂

3. Я бы тоже рекомендовал рассмотреть возможность добавления .replace(/s /g,' ') в микс. Также, к вашему сведению, в этом сценарии m модификатор не нужен.