Я пытаюсь разобрать некоторый текст, и innerText не выводит символы новой строки. Я использовал пробел, но не уверен, почему он не работает. В переменной parts в этом случае должно быть 3 строки, но получается только одна.

Я уверен, что это должно быть что-то тривиальное, что я упускаю.





  
  
  Документ




  
1 00:00:13,513 --> 00:00:16,607 a 2 00:00:18,218 --> 00:00:20,516 b 3 00:00:22,355 --> 00:00:24,880 c

Обновление

Спасибо за ответы, но моя строка немного сложнее, чем abc. Я обновил код с более реальным примером. Регекс взят из кода разбора файла srt, и он работает, если я загружаю файл, но не работает, когда я вставляю текст. Что не так с html? Я пытаюсь посмотреть на сайте regex101, чтобы понять, смогу ли я разобраться с этим.

live-love

Ответов: 3

Ответы (3)

Ваше регулярное выражение неправильно отформатировано. \r?\n\s+\r?\n означает:

  • \r? - опционально соответствует переводу строки
  • \n - соответствует новой строке
  • \s+ - Сопоставить один или несколько символов пробела
  • \r? - опционально соответствует переводу строки
  • \n - соответствует новой строке
  • .

Для этого требуется как минимум новая строка, за которой следуют пробелы, а затем еще одна новая строка. Но поскольку во входном тексте нет двух последовательных новых строк, ничего не разделяется.

Чтобы сопоставить полные строки, я бы просто разделил их по \n, обрезал каждую строку и отфильтровал пустые:

const text = `
a
b
c
`;
const result = text
  .split('\n')
  .map(str => str.trim())
  .filter(Boolean);
console.log(result);

Если вы хотите сделать это с помощью одного регулярного выражения, сопоставьте \S (без пробелов), а затем столько символов, сколько сможете, пока не дойдете до конца строки:

const text = `
a
b
c
`;
const result = text.match(/\S(?:.*\S)?/g);
console.log(result);

Учитывая измененный текст, если вы хотите подобрать его вместо этого, удалите \s+ из вашего регекса, поскольку между двумя последовательными новыми строками нет пробельных символов:

const text = `
1
00:00:13,513 --> 00:00:16,607
a

2
00:00:18,218 --> 00:00:20,516
b

3
00:00:22,355 --> 00:00:24,880
c
`;

console.log(
  text.split(/(?:\r?\n){2}/)
);

Я обнаружил, что в формате файла субтитров SRT для работы этого регекса требуется CR (возврат каретки).

Когда вы помещаете текст в div, он игнорирует символы CR, поэтому они не определяются innerText, поэтому этот regex не работает.

Когда вы это сделаете:

var parts = test1.split('\r')

Выдает 0 совпадений, потому что html скрывает символы возврата каретки.

Я решил закодировать свою строку в base64 и сохранить ее в input, вместо того чтобы хранить ее в div как есть.

Просто используйте

var parts = test1.split(/\s+/g).filter(n => n);





  
  
  Документ




  
a b c

2022 WebDevInsider