что делает этот запутанный регулярное выражение

Я столкнулся со следующим регулярным выражением на работе. Что оно делает?

,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))

Чтобы понять это, я разделил это на следующие части

  • , = Сопоставить все, что имеет ,

  • (?= = Вслед за

  • (?:[^\"]*\"[^\"]*\")* = Все, что не соответствует ", с последующим "сопровождается чем-то, что не соответствует ", с последующим ", Например, 1111 «ааааа»

  • (?![^\"]*\") = НО не следует ничего, что не " и совпадения "

Другими словами, сопоставьте все, что имеет , с последующим либо 11111"111" ИЛИ с последующим ""

Вариант использования, в котором приведенное выше выражение используется просто для токенизации строки, разделенной ,, но я предполагаю, что автор создал нечто более общее.

Кто-нибудь может дать более простое объяснение, чем выше?

Вышеупомянутое выражение используется, чтобы назначить выражение для boost :: regex ().

ОБНОВИТЬ:
На самом деле, он ищет запятые «,» со следующим ограничением

  1. Это нормально, что есть четное число «после запятой

  2. НО, это не хорошо иметь один «после запятой

Например, рассмотрим строку: a, «h, w», 23

Первое «,» соответствует, потому что оно имеет следующее четное число «(« h, w »)

Второе «,» между «h, w» НЕ совпадает из-за второго выражения (?! [^ \ «] * \»), В котором говорится, что за «,» не должно следовать ни одного »

Наконец последний «,» соответствует.

Окончательный результат будет 2,

0

Решение

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

, — запятая.

(?= — С последующим…

(?:[^\"]*\"[^\"]*\")* — Любая строка, заканчивающаяся на " пометить и содержащий четное общее количество " знаки или пустая строка,

(?![^\"]*\") — а другого нет " пометить позже в строке.

) закрыть (?=,

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

25,"Hello, world!","More text",123.45

регулярное выражение не должно совпадать с запятой между Hello и world, но должно совпадать с остальными тремя запятыми.

2

Другие решения

Других решений пока нет …