2014-02-21 3 views
1

У меня есть входной строки что-то вроде:нужно сформировать шаблон для regexp_replace

1.2.3.4_abc_4.2.1.44_1.3.4.23 
100.11.11.22_xyz-abd_10.2.1.2_12.2.3.4 
100.11.11.22_xyz_123_10.2.1.2_1.2.3.4 

я должен заменить первую строку, сформированную между двумя IPaddress, которые отделены друг от друга _, однако в какой-то струны _ является частью строка замены (xyz_123)

Я должен найти abc, xyz-abd и xyz_123 из указанной выше строки, чтобы я мог заменить другой столбец в этой таблице.

ответ

2
_.*?_(?=\d+\.) 

соответствует _abc_, _xyz-abd_ и _xyz_123_ в ваших примерах. Это работает для вас?

DECLARE 
    result VARCHAR2(255); 
BEGIN 
    result := REGEXP_REPLACE(subject, $$_.*?_(?=\d+\.)$$, $$_foo_$$); 
END; 
+0

Как добавить «_» в столбец замены, например: update table1 set column1 = regexp_repl ace (column1, '_. *? _ (? = \ d + \.)', column2), здесь мне нужно добавить column2 с "_", но не уверен, как это сделать – Ayush

2

Вероятно, это достаточно:

_[^.]+_ 

и заменить

_Replacement_ 

here on Regexr Посмотри.

[^.]+ использует negated character class, чтобы соответствовать последовательности, по меньшей мере, одного (the + quantifier), но не «.». персонажи.

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

Если PostgreSQL поддерживает lookbehind and lookahead assertions, то можно избежать "_" в строке замены:

(?<=_)[^.]+(?=_) 

See it on Regexr

+0

Спасибо за ваше предложение, можно ли избегайте «_» для строки замены – Ayush

+0

@Ayush, это зависит от того, что поддерживает PostgreSQL. Улучшил мой ответ. – stema

+0

Кажется, что postgres не поддерживают последующее регулярное выражение, которое вы предоставили, любую помощь о том, как добавить «_» со столбцом, я попытался с помощью «_» + column2 + «_», но он не работает – Ayush

0

Чтобы отобразить сопрягать первые два "", а @stema и @Tim Pietzcker упомянул о работе регулярных выражений. Затем, чтобы добавить «» в столбец, с которым я боролся, можно сделать с помощью || Оператор, как, например, ниже

обновление table1 множества COLUMN1 = regexp_replace (COLUMN1, '*? (? = \ d +).', '' || COLUMN2 || '_')

Тогда для использования другая таблица для запроса на обновление, ниже, например, может быть полезным

обновления table1 в т множество cOLUMN1 = regexp_replace (column1, '*? (? = \ d +).', '' || column2 || '_') из таблицы2 как t2, где t.id = t2.id [другие критерии]

Смежные вопросы