Люди, похоже, не понимают, что им не нужно использовать RE (или SQL, но это другая проблема :-) для каждой задачи, особенно с процедурным кодом, чище.
Если вы ограничиваете себя использованием RE, я думаю, что это нехватка зрения.
Я бы просто обработал строку, токен за токеном, где токен является одним из:
- не разделитель.
- разделитель столбцов.
- разделитель строк.
Начните с пустого списка столбцов, затем извлеките (используя indexOf / substring) до первого следующего разделителя строки / столбца, добавив этот текст в список столбцов.
Если разделителем является столбец, продолжайте.
Если разделителем является строка, проверьте количество столбцов и обработайте список, как требуется.
Если окончательного разделителя строк нет, а список столбцов не пуст, формат был неверным.
Извините, если вы действительно использовали метод RE, но я не верю, что он необходим (или даже желателен) здесь.
Псевдокод (только первый срез, может быть слегка ошибочным):
def processStr(s):
if not s.endsWith ("|ROW-DELIM|"):
error "Invalid format"
columnList = []
while not s.equals (""):
nextRowDelim = s.indexOf ("|ROW-DELIM|")
nextColDelim = s.indexOf ("|COL-DELIM|")
if nextColDelim == NotFound:
nextColDelim = nextRowDelim + 1
nextDelim = minimumOf (nextRowDelim,nextColDelim)
columnList.add (s.substring (0, nextDelim))
s = s.substring (nextDelim)
if nextDelim == nextRowDelim:
s = s.substring (length ("|ROW-DELIM|"))
processColumns (columnList)
columnList = []
else:
s = s.substring (length ("|COL-DELIM|"))
Вы можете легко добавить код для проверки правильного количества столбцов в этом коде или в processColumns()
, если вы этого хотите.