Я не думаю, что вы можете сделать простое регулярное выражение здесь.Во-первых, класс символов, который вы используете, [^,,,]
, ничем не отличается от [^,]
- повторяющиеся символы, заключенные в квадратные скобки, не позволяют сопоставлять дублирующиеся символы в строке.Во-вторых, я не думаю, что отрицательное совпадение сработает, потому что регулярные выражения Oracle не поддерживают поиск.
Вы можете попробовать что-то вроде следующего:
SELECT REGEXP_SUBSTR(lineToParse, '.+?($|' || separator || ')', 1, 1) AS part_1
, REGEXP_SUBSTR(lineToParse, '.+?($|' || separator || ')', 1, 2) AS part_2
, REGEXP_SUBSTR(lineToParse, '.+?($|' || separator || ')', 1, 3) AS part_3
, REGEXP_SUBSTR(lineToParse, '.+?($|' || separator || ')', 1, 4) AS part_4
INTO field1, field2, field3, field4
FROM DUAL;
Это все поможетлибо к разделителю, либо к концу линии нежадным способом.Теперь единственная проблема заключается в том, что возвращаемые значения могут включать разделители;Есть несколько способов избежать этого, самый простой из которых - использовать REPLACE()
, но с Oracle 11 вы также можете использовать подвыражения с REGEXP_SUBSTR()
:
SELECT REGEXP_SUBSTR(lineToParse, '(.+?)($|' || separator || ')', 1, 1, 'c', 1) AS part_1
, REGEXP_SUBSTR(lineToParse, '(.+?)($|' || separator || ')', 1, 2, 'c', 1) AS part_2
, REGEXP_SUBSTR(lineToParse, '(.+?)($|' || separator || ')', 1, 3, 'c', 1) AS part_3
, REGEXP_SUBSTR(lineToParse, '(.+?)($|' || separator || ')', 1, 4, 'c', 1) AS part_4
INTO field1, field2, field3, field4
FROM DUAL;
Однако, если начинается lineToParse
с разделителем, вам все равно придется иметь дело с этим каким-то образом.Изменение первого экземпляра REGEXP_SUBSTR()
на это, кажется, работает:
REGEXP_SUBSTR(lineToParse, '^(' || separator || ')?(.+?)($|' || separator || ')', 1, 1, 'c', 2) AS part_1
Надеюсь, это поможет.