Разделить после регулярного выражения max, не теряя разделитель - PullRequest
0 голосов
/ 18 февраля 2019

Я хотел бы преобразовать строку вроде: hello!world.what?up в ["hello!", "world.", "what?", "up"]

.split(/[?=<\.\?\!>]+/) близко к тому, что я ищу, и возвращает:

["hello", "world", "what", "up"]

.split(/(?=[\?\!\.])/) еще немного ближе, что возвращает:

["hello", "!world", ".what", "?up"]

Это делает трюк, но это не красиво:

.split(/(?=[\?\!\.])/).map((s, idx, arr) => { (idx > 0) s = s.slice(1); return idx < arr.length - 1 ? s + arr[idx+1][0] : s }).filter(s => s)

Как бы я перефразировал это, чтобы получить желаемый результат?

Редактировать: Обновленный вопрос.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

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

const items =
  'hello!world.what?'.match(/\w+\W/g);

console.log(items);

enter image description here


обновить после комментария

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

const items =
  'hello!world.what?'.match(/\w+[!.?]/g);

console.log(items);

enter image description here


дополнительное обновление

предыдущее решениевыберет только буквенно-цифровые символы перед !.?. Если вы хотите сопоставить любой символ, кроме разделителей, тогда используйте

const items =
  'hello!world.what?up'.match(/[^!.?]+([!.?]|$)/g);

console.log(items);

enter image description here

0 голосов
/ 18 февраля 2019

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

let input = "hello!world.what?";

const customSplit = (str) =>
{
    let token = "#";
    return str.replace(/[!.?]/g, (match) => match + "#")
        .split(token)
        .filter(Boolean);
}

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