RegEx:替换部分动态字符串

时间:2011-01-04 13:16:53

标签: regex sql-server-2005

我有一个字符串

ISNULL(VSK1_DVal.RuntimeSUM,0),

我需要删除IsNull部分,因此结果将是

VSK1_DVal.RuntimeSUM,

我是RegEx的新手,但如果不是一件事,这不会是一个问题: VSK1是动态部分,可以是A-Z,0-9和任意长度的任意组合。如何用RegEx替换字符串?我使用MSSQL 2k5,我认为它使用一般的RegEx规则集。

编辑:我忘了说,我在SSMS查询窗口的替换框(^ H)中进行替换 - 没有构建RegEx查询

BR 的Marius

4 个答案:

答案 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'来识别模式的开始?如果是这样,试试这个(注意'/ i'代表不区分大小写的匹配):

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

答案 1 :(得分:0)

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

然后选择组匹配号码1。

答案 2 :(得分:0)

这是一个非常有用的网站:http://www.regexlib.com/RETester.aspx

他们有一个测试仪和一个备忘单,对于快速测试这类非常有用。

我测试了Dave的解决方案并且它工作正常,除了它还删除了你想要保留的尾随逗号。需要修理的小事。

试试这个:

IsNULL\((.*,)0\)

答案 3 :(得分: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(%,_%),'