Сопоставление регулярных выражений с отрицательным внешним видом за двумя символами

#regex #negative-lookbehind

#регулярное выражение #отрицательный-внешний вид

Вопрос:

Я хочу разделить строку, используя символ «/», но разделение должно происходить только в том случае, если перед ним нет «».

Строка:

 /10/102-/ABC083.013/11/201201/20/83/30/463098194/32/7.7/40/0:20
 

Регулярное выражение:

 /*(?<!\)[^/]*/*(?<!\)[^/]*
 

Ожидаемый результат:

 /10/102-/ABC083.013
/11/201201
/20/83
/30/463098194
/32/7.7
/40/0:20
 

Но с моим регулярным выражением я получаю:

 /10/102-
/ABC083.013/11
/201201/20
/83/30
/463098194/32
/7.7/40
/0:20
 

пример регулярного выражения онлайн

Проблема в первой группе «/10/102- /ABC083.013», он не распознает строку «/» для первой группы. Я не знаю, как оптимизировать / изменить мое регулярное выражение, чтобы оно правильно распознало первую группу.

Ответ №1:

Другой вариант — сопоставить 2 раза косую черту и сопоставить a только / тогда, когда перед ним

 (?:/(?:[^/]|(?<=\)/) ){2}
 

Объяснение

  • (?: Не группа захвата
    • / Совпадение /
    • (?: Не группа захвата
      • [^/] Сопоставьте любой символ, отличный от /
      • | Или
      • (?<=\)/ Совпадению / не предшествует
    • ) Закройте группу и повторите 1 раз, чтобы соответствовать хотя бы 1 символу, отличному от /
  • ){2} Закройте группу и повторите 2 раза

Демонстрация регулярных выражений


Или немного более эффективная развернутая версия

 (?:/[^\/] (?:\.[^\/]*)*){2}
 

Объяснение

  • (?: Не группа захвата
    • /[^\/] Совпадение / , за которым следует 1 раз любой символ, кроме и /
    • (?: Не группа захвата
      • \.[^\/]* Сопоставьте экранированный символ, за которым следует 0 раз любой символ, кроме и /
    • )* Закройте группу и повторите 0 раз (в случае, если экранированный символ не встречается)
  • ){2} Закройте группу и повторите 2 раза

Демонстрация регулярных выражений

Ответ №2:

Вы можете использовать

 (?:/[^\/] ){2}(?:\/[^\/] )?
 

Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • (?:/[^\/] ){2} — два появления
    • / / символ
    • [^\/] — один или несколько символов, отличных от / и
  • (?:\/[^\/] )? — необязательное появление:
    • \ символ
    • / / символ
    • [^\/] — один или несколько символов, отличных от / и

Комментарии:

1. Это работает отлично. С {2} я тоже пытался, но, очевидно, ошибался. Большое вам спасибо!

2. @Maisen1886 (?:/[^\/] ){2} равно /[^\/] /[^\/] . Повторения последовательностей шаблонов должны быть определены с помощью групп, не захватывающих (если поддерживается), с (?:...) .