我有一个字符串
ISNULL(VSK1_DVal.RuntimeSUM,0),
我需要删除IsNull部分,因此结果将是
VSK1_DVal.RuntimeSUM,
我是RegEx的新手,但如果不是一件事,这不会是一个问题: VSK1是动态部分,可以是A-Z,0-9和任意长度的任意组合。如何用RegEx替换字符串?我使用MSSQL 2k5,我认为它使用一般的RegEx规则集。
编辑:我忘了说,我在SSMS查询窗口的替换框(^ H)中进行替换 - 没有构建RegEx查询BR 的Marius
答案 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(%,_%),'