RegEx: заменить части динамических строк - PullRequest
0 голосов
/ 04 января 2011

У меня есть строка

IsNull (VSK1_DVal.RuntimeSUM, 0),

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

VSK1_DVal.RuntimeSUM,

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

РЕДАКТИРОВАТЬ: я забыл сказать, что я делаю замену в окне замены окна запроса SSMS (^ H) - не строит запрос RegEx

br marius

Ответы [ 4 ]

1 голос
/ 04 января 2011

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

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

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

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

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», чтобы определить начало шаблона?Если это так, попробуйте это (обратите внимание на '/ i', представляющий сопоставление без учета регистра):

orig = "somestuff = isnull(VSK1_DVal.RuntimeSUM,0),"
regex = /IsNull\(([^,]+),[^)]\)/i 
result = orig.sub(regex){$1} # result => somestuff = VSK1_DVal.RuntimeSUM,
0 голосов
/ 04 января 2011

Вы говорите в своем вопросе

Я использую 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 голосов
/ 04 января 2011

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

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

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

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

IsNULL\((.*,)0\)
0 голосов
/ 04 января 2011
/IsNULL\((A-Z0-9+),0\)/

Затем выберите групповой матч № 1.

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