В некотором смысле я ответил на свой вопрос, но я пытаюсь лучше понять ответ:
При использовании regexp_substr (в oracle) для извлечения первого вхождения числа (либо однозначные или многозначные), как / почему модификаторы *
и +
влияют на результаты? Почему +
обеспечивает поведение, которое я ищу, а *
- нет? *
- это мое использование по умолчанию в большинстве регулярных выражений, поэтому я был удивлен, что оно не соответствует моим потребностям.
Например, в следующем:
select test,
regexp_substr(TEST,'\d') Pattern1,
regexp_substr(TEST,'\d*') Pattern2,
regexp_substr(TEST,'\d+') Pattern3
from (
select '123 W' TEST from dual
union
select 'W 123' TEST from dual
);
использование regexp_substr(TEST,'\d*')
возвращает нулевое значение для ввода «W 123» - поскольку в строке существует ноль или более цифр, меня это поведение смущает. Я также запутался, почему он работает со строкой «123 W»
Насколько я понимаю, *
означает ноль или более вхождений элемента, которому он следует, а +
означает 1 или более вхождений предыдущий элемент. В примере, приведенном для pattern2 [\d*]
, почему он успешно захватывает "123" из "123 W", но он не берет 123 из "W 123", поскольку существует ноль или более вхождений di git, они просто не не существует в начале строки. Существуют ли дополнительные [подразумеваемые] логики c, связанные с использованием *
?
Примечание: Я некоторое время оглядывался, пытаясь найти похожие вопросы, которые помогли мне захватить «123» из «W 123», но ближе всего я нашел варианты regexp_replace, которые не соответствовали бы моим потребностям.