#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}
равно/[^\/] /[^\/]
. Повторения последовательностей шаблонов должны быть определены с помощью групп, не захватывающих (если поддерживается), с(?:...)
.