Arhn - архитектура программирования

Javascript - регулярное выражение для разделения строки на неэкранированный символ, например. | но игнорируйте \|

Я прочитал строку из файла, который я разделил на | персонаж. Например, строка

1|test pattern|prefix|url|postfix

Таким образом, разделение всегда должно давать мне 5 подстрок, которые в приведенном выше случае

["1", "test pattern", "prefix", "url", "postfix"]

Проблема возникает, когда любая из этих пяти подстрок содержит | персонаж. Я бы сохранил его как экранированный \|

1|test pattern|prefix|url \| title |postfix

Теперь вы можете видеть, что string.split('|') не даст мне желаемого результата. Желаемый результат

["1", "test pattern", "prefix", "url \| title ", "postfix"]

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

string.split(/[^\\]\|/)  //["", "", "prefi", "$url \| $titl", " postfix"]

Похоже, это возможно только с отрицательными ретроспективными обзорами, но мне не удалось заставить их работать.

05.09.2012

  • Я так понимаю, у вас нет контроля над символом, используемым в строке для разделения элементов? 05.09.2012
  • Ваша строка дает: ›› var word = '1|тестовый шаблон|префикс|url \| заголовок |постфикс'; ›› слово 1|тестовый образец|префикс|url | title |postfix Вы имели в виду, что это '1|тестовый шаблон|префикс|url \\| заголовок |postfix' вместо этого? 05.09.2012
  • @Patrick: я не могу изменить разделитель, потому что теперь он используется во многих файлах, но я могу изменить escape-символ \ 05.09.2012
  • Почему вы проверили сломанный ответ? 01.05.2020

Ответы:


1

Другое решение:

"1|test pattern|prefix|url \\| title |postfix"
.replace(/([^\\])\|/g, "$1$1|")
.split(/[^\\]\|/);

Тем не менее, вам нужно будет экранировать обратную косую черту в исходной строке другой обратной косой чертой, чтобы она работала:

"1|test pattern|prefix|url \\| title |postfix"
                           ^

Рабочая демонстрация доступна здесь.

05.09.2012
  • Это работает для строки, упомянутой в вопросе, но не работает для 1|тестового шаблона|префикса|url \\|\\| название |постфикс 05.09.2012

  • 2

    К сожалению, Javascript не поддерживает просмотр назад. Я не вижу простого решения, но в качестве обходного пути может подойти следующее:

    // use two backslashes in your string!
    var string = '1|test pattern|prefix|url \\| title |postfix';
    
    // create an arbitrary unique substitute character
    var sub = "-";
    
    string.replace(/\\\|/g,sub).split(/\|/);
    
    /* replace the substituted character again in your array of strings */
    

    В качестве альтернативы вы можете использовать что-то вроде этого:

    string.split(//\|\b//)
    

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

    05.09.2012
  • простой boundary сделал бы это... нет необходимости в replace 05.09.2012
  • @Anirudha Я добавил это как вариант, но он не работает с пробелами. 05.09.2012
  • @Christoph Это самое близкое, что я мог придумать. Но проблема в том, что любой символ, используемый в качестве произвольного разделителя, также может встречаться в тексте в любой из подстрок. 05.09.2012
  • @Kashif хорошо, вы можете просто использовать граничное регулярное выражение или решение sp00m, которое гораздо более элегантно и надежно. 05.09.2012

  • 3

    Вместо использования split() вы можете сопоставить все интересующие вас события:

    var rx = /([^\\\|]|\\\|?)+/gi, item, items = [];
    while (item = rx.exec(str)) {
        items.push(item[0]);
    }
    

    Посмотрите его в действии в Fiddle.

    05.09.2012
  • +1 за хорошую идею решения проблемы. Однако решение не работает полностью, есть несколько неожиданных пустых элементов. 05.09.2012
  • @Kashif, да, я пропустил [0] в элементе, см. jsfiddle.net/3uJYm, все работает нормально 05.09.2012

  • 4
    'foo|bar\\|baz'.match(/(\\\||[^|])+/g)
    

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

    30.04.2020
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..