Я столкнулся со следующим регулярным выражением на работе. Что оно делает?
,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))
Чтобы понять это, я разделил это на следующие части
,
= Сопоставить все, что имеет ,
(?=
= Вслед за
(?:[^\"]*\"[^\"]*\")*
= Все, что не соответствует "
, с последующим "
сопровождается чем-то, что не соответствует "
, с последующим "
, Например, 1111 «ааааа»
(?![^\"]*\")
= НО не следует ничего, что не "
и совпадения "
Другими словами, сопоставьте все, что имеет ,
с последующим либо 11111"111"
ИЛИ с последующим ""
Вариант использования, в котором приведенное выше выражение используется просто для токенизации строки, разделенной ,
, но я предполагаю, что автор создал нечто более общее.
Кто-нибудь может дать более простое объяснение, чем выше?
Вышеупомянутое выражение используется, чтобы назначить выражение для boost :: regex ().
ОБНОВИТЬ:
На самом деле, он ищет запятые «,» со следующим ограничением
Это нормально, что есть четное число «после запятой
НО, это не хорошо иметь один «после запятой
Например, рассмотрим строку: a, «h, w», 23
Первое «,» соответствует, потому что оно имеет следующее четное число «(« h, w »)
Второе «,» между «h, w» НЕ совпадает из-за второго выражения (?! [^ \ «] * \»), В котором говорится, что за «,» не должно следовать ни одного »
Наконец последний «,» соответствует.
Окончательный результат будет 2,
Похоже, что он будет соответствовать любой запятой, но только если есть четное число "
символы после этой запятой.
,
— запятая.
(?=
— С последующим…
(?:[^\"]*\"[^\"]*\")*
— Любая строка, заканчивающаяся на "
пометить и содержащий четное общее количество "
знаки или пустая строка,
(?![^\"]*\")
— а другого нет "
пометить позже в строке.
)
закрыть (?=
,
Это может быть полезно, если мы уже знаем, что вся входная строка имеет четную сумму "
символов, нет такой вещи, как вложение или экранирование кавычек, и запятые между кавычками не должны рассматриваться как разделители. Например, учитывая вход
25,"Hello, world!","More text",123.45
регулярное выражение не должно совпадать с запятой между Hello и world, но должно совпадать с остальными тремя запятыми.
Других решений пока нет …