regex capture group help netsuite / oracle - PullRequest
4 голосов
/ 04 июля 2019

Я уже некоторое время играю на regex101 и не могу понять это, и, возможно, это из-за версии regex, используемой в NetSuite. На regex101, используя строку ниже, он выделяет нужную мне часть как группу 1, но ничего не дает в NetSuite.

Я пробовал: (?:,[^,]+,?){2}(,[^,]+,?) чтобы попытаться получить значение между 3-й и 4-й запятыми из этого набора данных:

+000000006 06:23:15.291450,W-CHEVLPFULL-LP | ,+000000006 06:23:15.291450,W-CHEVUS | ,
+000000044 08:09:52.291450,W-ADITIVOSSM-SM | KM8014,+000000044 08:09:52.291450,W-CHEVLPFULL-LP | KM8014,
+000000125 00:53:18.291450,W-ADITHPSMFULL-HP-SM | ,+000000125 00:53:18.291450,W-ADITIVOSSM-SM | ,
+000000138 05:08:01.291450,W-ADITHPSMFULL-HP-SM | KM8512,+000000138 05:08:01.291450,W-EMPTYAVAILABLE | KM8512,
+000000138 05:20:45.291450,W-ADITIVOSSM-SM | ,+000000138 05:20:45.291450,W-EMPTYAVAILABLE |

Что будет:

W-CHEVUS | 
W-CHEVLPFULL-LP | KM8014
W-ADITIVOSSM-SM | 
W-EMPTYAVAILABLE | KM8512
W-EMPTYAVAILABLE |

Я пробовал другие «не захватывающие группы», и у меня были странные результаты, из-за которых я думаю, что они не поддерживаются или я их неправильно использую.

Любая помощь будет принята с благодарностью. Спасибо!

Ответы [ 4 ]

1 голос
/ 04 июля 2019

В самом сложном случае вы можете использовать:

^([^,]*),([^,]*),([^,]*),([^,]*),?$

Затем вы можете использовать \1, \2, \3, \4 для доступа к любому полю, которое вы хотите.

Тест здесь .


Если все в одной строке, то вам нужен каждый четвертый элемент из строки.

Обновленное регулярное выражение будет:

[^,]*,[^,]*,[^,]*,([^,]*),?

Получите вашу строку с \1.

Test здесь .

Конечно, я не знаю особенностей вашего конкретного инструмента, поэтому я не могу "компенсировать" их.

1 голос
/ 04 июля 2019

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

^[^,]+(?:,[^,]+){2},([^,]+)
  • ^ Начало строки
  • [^,]+ Совпадение 1+ раз не запятая
  • (?:,[^,]+){2} Повторите 2 раза, используя запятую, затем 1+ раз, не запятую
  • , Соответствует третьей запятой
  • ([^,]+) Захват в группе 1, соответствующий 1+ раз, не запятая

Regex demo

0 голосов
/ 04 июля 2019

Поскольку вы на самом деле используете Oracle за кулисами, вы можете использовать

REGEXP_SUBSTR(col, '^([^,]*,){3}([^,]+)', 1, 1, NULL, 2)

См. regex demo

Подробно

  • ^ - начало строки
  • ([^,]*,){3} - три вхождения группы 1, соответствующие любым 0 или более символам, отличным от ,, а затем ,
  • ([^,]+) - группа 2 соответствует одному или нескольким символам, отличным от ,.

Последний аргумент 2 означает, что возвращается только значение группы 2.

0 голосов
/ 04 июля 2019

Я предполагаю, что это выражение может вернуть нужные данные:

.+?,.+?,.+?,(.+?)(?:\s*,|\s*$)

DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...