2011-01-04 2 views
0

У меня есть строкаRegEx: Заменить части динамических строк

IsNull (VSK1_DVal.RuntimeSUM, 0),

Мне нужно удалить IsNull часть, так что результат будет

VSK1_DVal.RuntimeSUM,

Я абсолютный новичок в RegEx, но это не было бы проблемой, если бы не одна вещь: VSK1 динамическая часть, может быть любой комби нации A-Z, 0-9 и любой длины. Как заменить строки на RegEx? Я использую MSSQL 2k5, я думаю, что он использует общий набор правил RegEx.

EDIT: Я забыл сказать, что я делаю замену в SSMS запросов окна Заменит Box (^ H) - не строит RegEx запроса

уш Marius

+0

«Я использую MSSQL 2k5, я думаю, что он использует общий набор правил RegEx». Это неверно, если вы не включите CLR и не скомпилируете и не установите сборку. –

ответ

0
/IsNULL\((A-Z0-9+),0\)/ 

Затем выбрать матч группового номер 1.

+0

Привет, Дэвид. Извините, но я получаю сообщение, что строка поиска не найдена. –

1

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

[^(]+\(([^,]+),[^)]\) 

Затем используйте группу захвата $1, чтобы извлечь нужную деталь.

Я сделал проверку вменяемости в рубин:

orig = "IsNull(VSK1_DVal.RuntimeSUM,0)," 
regex = /[^(]*\(([^,]+),[^)]\)/ 
result = orig.sub(regex){$1} # result => VSK1_DVal.RuntimeSUM, 

Это становится сложнее, если у вас есть префикс, который вы хотите сохранить. Например, если у вас есть это:

"somestuff = IsNull(VSK1_DVal.RuntimeSUM,0)," 

В этом случае вам нужно каким-то образом определить начало шаблона. Может быть, вы можете использовать '=' для определения начала шаблона? Если это так, это должно работать:

orig = "somestuff = IsNull(VSK1_DVal.RuntimeSUM,0)," 
regex = /=\s*\w+\(([^,]+),[^)]\)/ 
result = orig.sub(regex){$1} # result => somestuff = VSK1_DVal.RuntimeSUM, 

Но тогда случай, когда у вас нет знака равенства, не удастся. Может быть, вы можете использовать «IsNull» для определения начала шаблона? Если это так, попробуйте это (обратите внимание на «/ я», представляющую регистрозависимость соответствие):

orig = "somestuff = isnull(VSK1_DVal.RuntimeSUM,0)," 
regex = /IsNull\(([^,]+),[^)]\)/i 
result = orig.sub(regex){$1} # result => somestuff = VSK1_DVal.RuntimeSUM, 
+0

Привет, Дэйв, у меня есть длинный скрипт, и эти строки являются лишь частью этого. Ваш скрипт найдет часть, в которой я нуждаюсь, но также много персонажей раньше, если моя строка не находится в начале строки: VSK1_DVal_SUM = isnull (VSK1_DVal.RuntimeSUM, 0) Это моя строка, и ваше регулярное выражение выберет всю строку, а не часть из IsNull (... –

+0

Привет, bala, я добавил еще два примера, которые надеюсь, поможет вам сохранить префиксы. Удачи! – Upgradingdave

+0

Привет, Дейв, поскольку я должен заменить IsNul .., его можно использовать как начало шаблона. Я попробую ваше решение и сообщите, все ли хорошо прошло –

0

Вот очень полезный сайт: http://www.regexlib.com/RETester.aspx

Они имеют тестер и Cheatsheet, которые очень полезны для быстрого тестирования такого рода.

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

Попробуйте это:

IsNULL\((.*,)0\) 
+0

этот находит строку без проблемы, но как его заменить? –

0

Вы говорите, что в вашем вопросе

Я использую MSSQL 2k5, я думаю, что он использует общий набор правил RegEx.

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

WITH T(C) AS 
(

SELECT 'IsNull(VSK1_DVal.RuntimeSUM,0),' UNION ALL 
SELECT 'IsNull(VSK1_DVal.RuntimeSUM,123465),' UNION ALL 
SELECT 'No Match' 
) 
SELECT SUBSTRING(C,8,1+LEN(C)-8-CHARINDEX(',',REVERSE(C),2)) 
FROM T 
WHERE C LIKE 'IsNull(%,_%),' 
+0

Привет, Мартин, я абсолютно забыл сказать, что мне нужно заменить в окне Query Query, а не непосредственно в TSQL ... –

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