Как разделить строку с помощью ряда регулярных выражений и сохранить исходный порядок строки? - PullRequest
2 голосов
/ 04 апреля 2019

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

На данный момент у меня есть регулярное выражение, которое извлекает текст, который нужно изменить, но оставляя все остальное.

var regex = /[A-Z]+-[0-9]+[\s]+specificText+[\s]+[0-9)]+[\s]+|specificText[\s]+[0-9]+/gi
var str = "KJSDHFS345  KJSDHFS345      BLAH-3242352    specificText      456    specificText     564     SAUHAUH&^%  SAUHAUH&^%"
str.match(regex);

В настоящее время я получаю следующий массив в результате:

["BLAH-3242352    specificText      456    ", "specificText     564"]

Однако я ищу способ вернуть массив, подобный этому:

["KJSDHFS345  KJSDHFS345      ", "BLAH-3242352    specificText      456    ", "specificText     564", "     SAUHAUH&^%  SAUHAUH&^%"]

Как заставить массив поддерживать исходный порядок абзаца, независимо от того, какие символы содержатся?

1 Ответ

2 голосов
/ 04 апреля 2019

Вероятно, было бы проще использовать split, а не match: захватить требуемые подстроки, и они будут отделены от несоответствующих частей, в то же время включив все в получившийся массив:

var regex = /([A-Z]+-[0-9]+[\s]+specificText+\s+[0-9)]+\s+|specificText\s+[0-9]+)/i
var str = "KJSDHFS345  KJSDHFS345      BLAH-3242352    specificText      456    specificText     564     SAUHAUH&^%  SAUHAUH&^%"
console.log(str.split(regex).filter(Boolean));

(обратите внимание, что класс символов, который имеет только один токен, является излишним; вы можете использовать только этот один токен, и при split ting не требуется глобальный флаг)

Если бы у вас было для использования match, я полагаю, уродливым способом было бы чередовать ваш оригинальный шаблон с <any characters which aren't the start of a match to the original pattern>:

var regex = /[A-Z]+-[0-9]+\s+specificText+\s+[0-9)]+\s+|specificText\s+[0-9]+|(?:(?![A-Z]+-[0-9]+\s+specificText+\s+[0-9)]+\s+|specificText\s+[0-9]+).)+/gi
//                                                                            ^^^^^^^ ...
var str = "KJSDHFS345  KJSDHFS345      BLAH-3242352    specificText      456    specificText     564     SAUHAUH&^%  SAUHAUH&^%"
console.log(str.match(regex));

Но я бы не советовал - метод split гораздо проще читать и писать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...