Разделить строку по вхождению символа - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь написать регулярное выражение для использования в функции split() для разделения строки, следуя этим правилам:

  1. Если найдено \, чем разделениепроизводится перед символом \ и после символа после знака после \ (например, "Hel\\7o".split()["Hel", "\7", "o"];
  2. Если найден %, у нас аналогичное поведение, но япринимать только буквы. (например, "He%7l%lo".split()["He%7l", "%l", "o"];
  3. Если между "" или '' есть какая-то строка, они разделяются (например, "Hel\"lo\"".split()["Hel", ""lo""];
  4. Если найден , или :, или /, мы разделяемся (например, "Hel/lo Wor:ld".split()["Hel", "/", "lo", " ", "Wor", ":", "ld"];

Я достиг того, что есть я 'Мы уже говорили с этим следующим регулярным выражением: /(\\.|%[a-zA-Z]|\".*\"|\'.*\'|:|\/| )/.

Теперь мне нужно одно последнее правило разбиения, которое заключается в том, что мне нужно отделить вхождения в символы от вхождений другого в основном.У меня есть "mmDD", я хотел бы иметь ["mm", "DD"].
Конечно, до сих пор это должно работать со всеми другими правилами, поэтому "mm mmDDYYy%y" вернет ["mm", " ", "mm", "DD", "YY", "y", "%y"].
В этом последнемпример вамтакже видно, что это последнее правило должно быть чувствительным к регистру ("YY" отделяется от "y").

Я нашел этот ответ -> JavaScript Split string по нескольким вхождениям букв Но это не помогает мне, так как теряет количество вхождений (например, "mmDD".split(/(.)\1*/) возвращает ["m","D"], но мне нужно ["mm","DD"].

Я пытался поиграть практически со всемиправила регулярных выражений, но я схожу с ума после этого.Возможно ли даже напрямую с помощью функции split()?

Спасибо за помощь.

РЕДАКТИРОВАТЬ: Если это поможет, вот ссылка regex101 https://regex101.com/r/ezXKkG/1/

Кроме того, Wiktor Stribiżew предложил (?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[a-z])), который я добавил в глобальное правило следующим образом: /(\\.|%[a-zA-Z]|\".*\"|\'.*\'|:|\/| |(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[a-z]))/.

При этом "MMmm" делится на ["MM", "mm"] (Ницца!),но это не работает в случае, как: "MMmdD", который разделен на ["MM", "md", "D"]

1 Ответ

0 голосов
/ 10 апреля 2019

В конце концов, единственным способом, которым мне удалось решить проблему, было разделить мою цель на две части:

  1. Используя регулярное выражение, аналогичное тому, которое я впервые упомянул (/(\\.|%[a-zA-Z]|\"[^"]*\"|\'[^']*\'|:|\/| +|\w+)/), яразбить строку, следуя первым четырем нужным мне правилам:
  2. Чтобы выполнить пятое и последнее правило, я запускаю следующий фрагмент кода:

    tokens = toSplit.split(/(\\.|%[a-zA-Z]|\".*\"|\'.*\'|:|\/| )/);
    tokens.forEach(token => {
        if (/^[a-zA-Z]$/).test(token) {
            let newToken = '';
    
            for (let i = 0, len = token.length; i < len; i++) {
                const tokenChar = token[i];
                const lastChar = newToken[newToken.length - 1];
                if (lastChar && lastChar !== tokenChar) {
                    // saving newToken
                    newToken= '';
                }
    
                newToken+= tokenChar;
            }
        }
    )}
    

По сути, для каждой строки, которую я извлек с помощью регулярного выражения, я проверяю, состоит ли она только из символов.Если это так, я вручную разделяю строку на другую подстроку, итерируя ее.

Я знаю, что этот ответ не решает проблему, используя только регулярное выражение в функции split, но я пока не нашел другого решения,По крайней мере, это работает, и кто-то может найти это полезным.

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